ความหมายของสัญลักษณ์ `| 'ในเปลือกคืออะไร?


16

อะไร|เป็นสัญลักษณ์หมายถึงในsudo ps -ef | grep processnameคำสั่ง?

ทุกคนสามารถอธิบายคำสั่งนี้ได้ด้วยหรือไม่ ฉันได้ใช้คำสั่งนี้เท่านั้นในการรับ PID และฆ่ากระบวนการที่ แต่ฉันยังเห็นsudo ps -ef | grep processname | grep -v grepและผมรู้สึกว่า-v grepเป็นเหมือนการฆ่าสร้าง PID grepก่อนหน้านี้สำหรับ ถ้าเป็นเช่นนั้นมันทำงานอย่างไร


4
คุณไม่จำเป็นที่จะเรียกใช้sudo ps -efนอกจากนี้ยังมีเคล็ดลับทั่วไปเพื่อหลีกเลี่ยงคำสั่งที่สามคือการล้อมตัวละครของชื่อกระบวนการในวงเล็บเหลี่ยม:ps -ef | grep [p]rocessname
kos

1
@kos คำสั่งนั้นต้องการอัญประกาศเพื่อให้ทำงานได้อย่างเชื่อถือได้:ps -ef | grep '[p]rocessname'
kasperd

2
@kos หากคุณเขียนgrep [p]rocessnameคุณจะบอกให้เชลล์หาไฟล์ในไดเรกทอรีปัจจุบันด้วยชื่อprocessnameและแทนที่รูปแบบด้วยชื่อของไฟล์นั้น หากไม่มีไฟล์ชื่อprocessnameอยู่เชลล์อาจส่งผ่านรูปแบบตามตัวอักษรไปยัง grep แต่ขึ้นอยู่กับการตั้งค่าของคุณ ดังนั้นรุ่นของคุณจะแตกถ้าไฟล์ชื่อprocessnameอยู่หรือถ้าตัวเลือกใด ๆ เปลือกต่อไปนี้ได้รับการเปิดใช้งานfailglob, ,nullglob nocaseglob
kasperd

1
@kasperd ฉันอ่านความคิดเห็นครั้งสุดท้ายผิดคุณตอบถูกทุกข้อ ฉันไม่ได้พิจารณาเรื่องนั้น
kos

1
ฉันไม่อยากจะเชื่อว่านี่จะไม่ซ้ำกัน
Mast

คำตอบ:


13
ps -ef | grep processname

มันรันsudo ps -efและส่งผ่านผลลัพธ์ไปยังคำสั่งที่สองก่อน

คำสั่งที่สองกรองบรรทัดทั้งหมดที่มีคำว่า "processname"

ps -ef | grep processname | grep -v grepแสดงรายการทุกบรรทัดมีและไม่ได้มีprocessnamegrep

ตามที่ man grep

-v, --invert-match
              Invert the sense of matching, to select non-matching lines.  (-v
              is specified by POSIX.)

ตามที่ man ps

ps displays information about a selection of the active processes.

-e     Select all processes.  Identical to -A.

-f     Do full-format listing. This option can be combined with many
          other UNIX-style options to add additional columns.  It also
          causes the command arguments to be printed.  When used with -L,
          the NLWP (number of threads) and LWP (thread ID) columns will be
          added.  See the c option, the format keyword args, and the
          format keyword comm.

คุณสามารถรวมพารามิเตอร์วิธีเดียวกับ-ef-e -f

ที่จริงรายการเกิดขึ้นทั้งหมดของกระบวนการที่เรียกว่าps -ef | grep processnameprocessname


ขอบคุณสำหรับคำอธิบายอะไรps -efไม่แน่นอน?
อามีร์

ผมคิดว่าเมื่อเราทำงาน| grep processNameใน terminal เรายังได้รับการส่งออกของ grep ที่ตัวเองเป็นกระบวนการเพื่อ -v ฆ่าผลลัพธ์นี้
Aamir

คุณถูก.
Pilot6

35

pipeมันเรียกว่า มันให้เอาต์พุตของคำสั่งแรกเป็นอินพุตไปยังคำสั่งที่สอง

ในกรณีของคุณมันหมายถึง:
ผลลัพธ์ของการsudo ps -efป้อนเป็นข้อมูลของgrep processname

sudo ps -ef:
รายการนี้แสดงกระบวนการทั้งหมดที่กำลังทำงานอยู่ พิมพ์man psคำศัพท์เพิ่มเติม

grep processname
ดังนั้นรายชื่อของกระบวนการนี้จะถูกป้อนเข้า grep programnameซึ่งการค้นหาเพียงสำหรับโปรแกรมที่กำหนดโดย

ตัวอย่าง

การพิมพ์sudo ps -ef | grep firefoxในเทอร์มินัลของฉันส่งคืน:

parto     6501  3081 30 09:12 ?        01:52:11 /usr/lib/firefox/firefox
parto     8295  3081  4 15:14 ?        00:00:00 /usr/bin/python3 /usr/share/unity-scopes/scope-runner-dbus.py -s web/firefoxbookmarks.scope
parto     8360  8139  0 15:14 pts/24   00:00:00 grep --color=auto firefox

ตกลงสิ่งที่ -v grep มันทำอะไร
อามีร์

คำอธิบายที่ดี แต่ฉันต้องการความช่วยเหลือเกี่ยวกับ-v grep ฟังก์ชั่น ..
Aamir

โอ้ฉันเห็นว่าทำไมgrep -vมีการใช้ เพื่อกรองบรรทัดสุดท้าย
Pilot6

@Airir ดูคำตอบของฉัน grep -vกรอง OUT บรรทัดที่มีรูปแบบ
Pilot6

1
คุณสามารถเพิ่มว่าคุณสามารถใช้หลายท่อได้ เช่น echo "foobar" | grep foo grep bar
Michael

7

ฉันจะลองตอบคำถามนี้ด้วยคำตอบที่ตรงไปตรงมา:

ท่อ|ช่วยให้คุณทำสิ่งที่น่ากลัวในเปลือก! มันเป็นโอเปอเรเตอร์เดียวที่ฉันเห็นว่ามีประโยชน์และทรงพลังที่สุด

วิธีการเกี่ยวกับการนับไฟล์ในไดเรกทอรี? ง่าย:

ls | wc -l..red ไปยัง output ของlsถึงwcพารามิเตอร์ปัญญา-lสำหรับบรรทัด

หรือนับบรรทัดในไฟล์?

cat someFile | wc -l

ถ้าฉันต้องการค้นหาอะไร 'grep' สามารถค้นหาสตริงที่เกิดขึ้นได้:

cat someFile | grep aRandomStringYouWantToSearchFor

คุณเพียงแค่เปลี่ยนทิศทางเอาต์พุตของคำสั่งทางซ้ายของ Pipe ไปยังคำสั่งด้านขวาของไพพ์

อีกระดับหนึ่ง: มีสิ่งใดเกิดขึ้นในไฟล์บ่อยแค่ไหน

cat someFile | grep aRandomStringYouWantToSearchFor | wc -l

คุณสามารถใช้ | สำหรับเกือบทุกอย่าง :)

fortune | cowsay

ป้อนคำอธิบายรูปภาพที่นี่


2
ใช่ท่อมีความสนุกสนาน +1 แต่โปรดเปลี่ยนตัวอย่าง: UUOC
kos

grep -c "aRandomStringYouWantToSearchFor" "someFile"ไลค์: ;-)
Sadi

Ofc แต่สำหรับจุดประสงค์ของความเรียบง่าย ... ผู้ถามดูเหมือนจะไม่เป็นคนที่ลึกซึ้งมากขึ้นเช่น :)
Gewure

1
ตัวอย่างมากมายของคุณตรงไปตรงมาไม่จำเป็นต้องมีท่อ คุณเคยได้ยินเรื่องการปลดออกจากตำแหน่งหรือไม่? คุณกำลังใช้ cat และ pipe เมื่อคำสั่งจำนวนมากใช้ไฟล์เป็นพารามิเตอร์โดยตรงเช่น cat someFile | grep a RandomStringYouWantToSearchFor grep aRandomStringYouWantToSearch For someFile
Captain Lepton

พวก .. ฉันรู้ ถ้าคุณอ่านความคิดเห็นกัปตันคุณคงได้อ่านคำตอบของฉัน คนที่ถามคำถามจะไม่เข้าใจการใช้งานจริงของไปป์ - เขาไม่รู้ด้วยซ้ำว่า grep คืออะไร ดังนั้นฉันจะให้เขาตัวอย่างนี้ kill $(ps aux | awk '/someString/ { print $2}' | sed -n '1p') ไม่เพราะมันจะไม่ตอบสนองวัตถุประสงค์ทั้งหมด
Gewure

4

ฉันใช้คำสั่งนี้เพื่อรับ PID และฆ่ากระบวนการนั้นเท่านั้น

คำตอบอื่น ๆ ได้ตอบคำถามหลักของคุณแล้ว แต่ฉันต้องการที่อยู่นี้เช่นกัน;

โดยทั่วไปแล้วการฆ่ากระบวนการมักจะเกินกำลังและปล่อยให้ทรัพยากรที่จัดสรรโดยกระบวนการที่อยู่ในสภาพยุ่งเหยิงคุณมักจะสามารถยุติมันได้

นอกเหนือจากนี้เพียงใช้pkillเพื่อฆ่า / ยุติกระบวนการ pkillรองรับการระบุชื่อกระบวนการที่แน่นอนหรือการแสดงออกปกติ:

pkill -x foo # Terminates process foo
pkill ^foo$ # Terminates process foo
pkill -9 -x foo # Kills process foo
pkill -9 ^foo$ # Kills process foo

1
อย่าใช้kill -9เว้นแต่คุณจะรู้เป็นพิเศษว่าจะไม่มีสัญญาณอื่นใดทำงาน ดูเพิ่มเติมiki.fi/era/unix/award.html#kill
tripleee

@tripleee OP ระบุว่าพวกเขาต้องการที่จะฆ่ากระบวนการ
kos

นั่นคือสิ่งที่killทำ การระบุ-9เป็นตัวเลือกเพิ่มเติมเพิ่มเติมและเป็นหายนะบ่อยที่สุด
tripleee

@tripleee ฉันเชื่อว่าความสับสนเกิดขึ้นเนื่องจากคำศัพท์; ถึงฉันฆ่า = SIGKILL ไม่ใช่ SIGTERM
kos

สำหรับคนส่วนใหญ่ฉันคาดหวังว่า "ฆ่า" จะหมายถึงkillเรียบง่ายและเรียบง่าย คำศัพท์ใด ๆ ก็ตามคำตอบของคุณไม่ควรแนะนำให้คนใช้-9ตัวเลือกเว้นแต่คุณจะใส่คำเตือนเนื้อสัตว์
tripleee
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.