इनपुट में पहले N की संख्या को हटाने के लिए कमांड


11

पृष्ठभूमि

मैं SSH सर्वर चला रहा हूं और मेरे पास यह उपयोगकर्ता है जिसे मैं हटाना चाहता हूं। मैं इस उपयोगकर्ता को हटा नहीं सकता क्योंकि वह वर्तमान में कुछ प्रक्रियाओं को चला रहा है जिन्हें मुझे पहले मारने की आवश्यकता है।

यह वह पाइपलाइन है जिसका उपयोग मैं वर्तमान में उपयोग कर रहा हूं ताकि मैं वर्तमान में उपयोग कर रहे उपयोगकर्ता की सभी प्रक्रिया आईडी का पता लगा सकूं:

ps -u user | awk '{print $1;}'

आउटपुट इस तरह दिखता है:

PID
2121
2122
2124
2125
2369
2370

मैं kill -9सभी प्रक्रियाओं को मारने के लिए इसे पाइप करना चाहता हूं ताकि मैं इस बेवकूफ उपयोगकर्ता को इस तरह से हटा सकूं:

ps -u user | awk '{print $1;}' | sudo xargs kill -9

लेकिन PIDहेडर के कारण यह काम नहीं करता है :

kill: failed to parse argument: 'PID'

प्रश्न

मैं सोच रहा हूं कि इनपुट की पहली पंक्ति को हटाने के लिए एक साधारण यूनिक्स कमांड होना चाहिए।

मुझे पता है कि मैं इसके लिए उपयोग कर सकता हूं, tailलेकिन मैं यह नहीं गिनना चाहता कि इनपुट में कितनी लाइनें हैं, यह जानने के लिए कि मैं कितना प्रदर्शित करना चाहता हूं।

मैं कुछ ऐसा रहा हूँ headया tailलेकिन उल्टे (बजाय प्रदर्शित करने में केवल पहले / धारा के अंतिम भाग में यह प्रदर्शित करता है सब कुछ, लेकिन धारा के प्रारंभ / समाप्ति)।

ध्यान दें

मैं | grep [[:digit:]]अपने awkआदेश के बाद जोड़कर इस मुद्दे को हल करने में कामयाब रहा, लेकिन मैं अभी भी एक फ़ाइल की पहली पंक्ति को हटाने का एक तरीका ढूंढ रहा हूं क्योंकि मुझे लगता है कि अन्य परिदृश्यों में यह काफी उपयोगी होगा।


चूंकि आप पहले से ही awk का उपयोग कर रहे हैं, आप NRउदाहरण के लिए हेडर रिकॉर्ड (लाइन) का उपयोग कर सकते हैं awk 'NR>1 {print $1;}'। बेहतर अभी तक - का उपयोग करें pgrep -uयाpkill -u
14

@steeldriver दिलचस्प! एक उत्तर बनाएं और बताएं कि यह ( awkकमांड) कैसे काम करता है।
wefwefa3

जवाबों:


14

ध्यान दें: यदि आपके सिस्टम में पहले से ही pgrep/ pkillतो आप फिर से पहिये का आविष्कार कर रहे हैं। यदि आपके सिस्टम में ये उपयोगिताओं नहीं हैं, तो आपको psबिना लाइसेंस वाली PID सूची को सीधे प्राप्त करने के लिए आउटपुट स्वरूपित करने में सक्षम होना चाहिए जैसेps -u user -opid=

यदि आप पहले से ही उपयोग कर रहे हैं awk, तो पहली पंक्ति (रिकॉर्ड) को हटाने के लिए एक अतिरिक्त प्रक्रिया के माध्यम से पाइप करने की आवश्यकता नहीं है: बस रिकॉर्ड संख्या पर एक शर्त जोड़ेंNR

ps -u user | awk 'NR>1{print $1;}'

चूंकि आप उल्लेख करते हैं headऔर tail, इस मामले में आप जो सूत्र चाहते हैं वह हैtail -n +2


4
tail -n +2वास्तव में मैं क्या देख रहा था!
wefwefa3

psएक हेडर को प्रिंट नहीं करने के लिए कहने के लिए +1 -opid=, क्योंकि आउटपुट को कभी भी दिखाने से रोकता है। यदि भावी उपयोगकर्ता कभी भी psपाइप लाइन के बीच में आउटपुट को सॉर्ट करने का निर्णय लेता है , तो awk / sed / tail धारणा टूट सकती है।
जेफ स्कॉलर

8

जैसा कि मैं इस प्रश्न को लिख रहा था मैंने एक समाधान का उपयोग करके पता लगाया sed

इनपुट की शुरुआत में एक लाइन हटाएं

एक पंक्ति का उपयोग हटाने के लिए sed 1d

इनपुट की शुरुआत में कई लाइनें हटाएं

Nलाइनों के उपयोग की संख्या को हटाने के लिएsed 1,Nd

  • पहले 5 लाइनों को हटाने के लिए उपयोग करें sed 1,5d

  • पहले 10 लाइनों का उपयोग हटाने के लिए sed 1,10d

  • हटाने के लिए पहले 25 लाइनों का उपयोग करें sed 1,25d

पाइपलाइन

तो पाइप लाइन परिदृश्य में बन जाता है:

ps -u user | awk '{print $1;}' | sed 1d | sudo xargs kill -9
                                     ^ removes the PID header
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.