ฉันจะป้องกัน 'grep' ไม่ให้ปรากฏในผลลัพธ์ ps ได้อย่างไร


304

เมื่อฉันค้นหากระบวนการบางอย่างที่ไม่มีอยู่เช่น

$ ps aux | grep fnord                          
wayne    15745  0.0  0.0  13580   928 pts/6    S+   03:58   0:00 grep fnord

เห็นได้ชัดว่าฉันไม่สนใจ grep - ซึ่งก็สมเหตุสมผลกับการค้นหาpsกระบวนการ!

ฉันจะป้องกัน grep ไม่ให้ปรากฏในผลลัพธ์ได้อย่างไร


28
หากคุณต้องการเพียง PID ของกระบวนการคุณสามารถแทนที่ps aux |grepด้วยpgrep(หรือpgrep -f)
jofel

6
คำถามเดียวกันในServerfaultและSuperuser
ธ อร์

ผลลัพธ์ที่ถูกต้องหรือไม่ ดูเหมือนว่ามีโปรแกรมไม่มีชื่อ fnord ทำงาน ...
สาวก

4
@acolyte นั่นเป็นสิ่งที่แม่นยำ - แต่เนื่องจากมันส่งออก pip ไปยัง grep, grep จึงทำงานอยู่ (รอการส่งออกของps auxฉันคาดว่าจะได้) ดังนั้นคำถามคือวิธีการป้องกันgrep fnordจากการแสดงขึ้นเป็นกระบวนการทำงานเนื่องจากเห็นได้ชัดว่าผมไม่ได้สนใจในที่หนึ่ง
Wayne Werner

2
@acolyte ไม่ใช่เรื่องแปลกที่คุณจะไม่เห็นบรรทัด "fnord" คุณไม่ควรที่จะเห็นมัน หากคุณมีเวลา 2 หรือ 3 นาทีในการค้นหาให้ค้นหา
Francesco

คำตอบ:


439

เปิดออกมีวิธีแก้ปัญหาที่พบในพวงกุญแจ

$ ps aux | grep "[f]nord"

ด้วยการใส่เครื่องหมายวงเล็บล้อมรอบตัวอักษรและเครื่องหมายคำพูดรอบสตริงคุณค้นหา regex ซึ่งระบุว่า "ค้นหาตัวอักษร 'f' ตามด้วย 'nord'

แต่เนื่องจากคุณใส่เครื่องหมายวงเล็บในรูปแบบ 'f' แล้วตามด้วย ']' ดังนั้นgrepจะไม่แสดงในรายการผลลัพธ์ Neato!


26
@acolyte: เอาท์พุทจาก PS grep [f]nordจะมีสายที่ลงท้ายด้วย แต่สายที่จะไม่ทำให้ผ่านตัวกรอง grep เพราะสตริงไม่ตรงกับการแสดงออกปกติ[f]nord [f]nord
LarsH

9
@ LarsH น่าสนใจขอบคุณ! ฉันจะแนะนำps aux | grep fnord | grep -v grep... ซึ่งดูเหมือนว่าจะมีคนแนะนำไม่กี่คน ... lol
acolyte

5
@progo ใช่คุณจะต้องพูด[แม้ในทุบตี ลองกับไฟล์ที่เรียกว่าfnordในไดเรกทอรีปัจจุบัน
Gilles

25
การโละเอากระดาษออกของpsอาจเป็นกลอุบายเก่า แต่ก็ไม่น่าเชื่อถือ ใช้pgrepถ้ามี
Gilles

8
@naxa ลองนึกภาพคุณมีสายโปรแกรมและโปรแกรมที่เรียกว่าfnord safnordeหรือมีผู้ใช้ชื่อbfnordหนึ่งและคุณก็ฆ่ากระบวนการทั้งหมดของเขา อื่น ๆ
Gilles

163

ตัวเลือกอื่นที่ฉันใช้ (โดยเฉพาะเพื่อดูว่ากระบวนการกำลังทำงานอยู่) คือpgrep คำสั่ง สิ่งนี้จะค้นหากระบวนการจับคู่ แต่ไม่แสดงรายการบรรทัด grep สำหรับการค้นหา ฉันชอบเพราะมันเป็นวิธีการค้นหาที่รวดเร็วโดยไม่ต้อง regexing หรือหลบหนีอะไรเลย

pgrep fnord

8
พวกเขาจะต้องการตัวเลือกที่จะเป็นเหมือน-f ps | grep
จอร์แดน

@jordanm จริง ๆ แล้วpgrep -fจะมีลักษณะเหมือนps -f | grepกัน
michelpm

5
นอกจากนี้ยังมี-lอาร์กิวเมนต์เพื่อให้แสดงคำสั่งที่ถูกจับคู่
Patrick

15
ps | grep '[f]nord'เป็นคนฉลาดและเคารพ แต่ pgrep เป็นขวา
kojiro

3
คุณสามารถทำได้ps $(pgrep cmd) ...หาก `pgrep ไม่มีตัวเลือก (จะไม่สามารถใช้กับชุดคำสั่งที่ว่างเปล่าได้)
Maciej Piechotka

62

ทางออกที่ดีที่สุดคือการนำเสนอโดย BriGuy

pgrep fnord 

แต่ถ้าคุณไม่ต้องการทำเช่นนั้นคุณสามารถยกเว้นบรรทัดทั้งหมดที่ตรงกับgrepด้วย:

ps aux | grep -v grep | grep "fnord"

7
แต่ถ้าบรรทัดที่ฉันกำลังค้นหาคือ "bash bash grep bash"?
Sparr

1
@ Sparr จากนั้นคุณควรใช้ทางออกที่ดีที่สุด: pgrepหรือหาอีกคนหนึ่ง)
RSFalcon7

ระวังความยาวชื่อที่ จำกัด ด้วย pgrep ใช้ -f เพื่อรับชื่อพา ธ แบบเต็มหรือคุณอาจพบว่าการจับคู่ของคุณล้มเหลวด้วยชื่อที่ยาวกว่า -l ก็ดีเกินไปที่จะแสดงรายการการแข่งขัน
Neil McGill

25

ไม่ใช่ทางออกที่หรูหราที่สุด แต่คุณสามารถทำได้:

$ ps aux | grep fnord | grep -v grep


มันเป็นคำตอบที่ไม่ดี! เพราะถ้ามีคำgrepในวลีของคุณ มันจะไม่แสดงกระบวนการนั้น ตัวอย่างเช่นสมมติว่าไฟล์ที่เรียกว่าfoo_grep_bar.txtกำลังถูกแก้ไขโดยnanoคำสั่ง ดังนั้นจึงมีกระบวนการทำงาน: root 14908 0.0 0.0 110012 1692 pts / 3 S + Oct31 0:00 nano foo_grep_bar.txtตามคำตอบนี้จะไม่ทำงาน: $ ps aux | grep nano | grep -v grepเนื่องจากมีคำ grep ในชื่อไฟล์ของคุณ
Nabi KAZ

ฉันชอบสิ่งนี้เพราะมันชัดเจนเกี่ยวกับความตั้งใจมากกว่าคำตอบที่ยอมรับและใช้ได้ในทุกกรณียกเว้นกรณีเดียว
samaspin

1
ตามsuperuser.com/a/409658/450260คุณควรจะไม่รวมเต็มgrep fnordไม่ได้เป็นเพียงgrepเช่น $ ps aux | grep fnord | grep -v "grep fnord"
ดาวอส

15

ใน grep fnord =(ps aux)zsh,

แนวคิดคือเรียกใช้ครั้งแรกps auxวางผลลัพธ์ลงในไฟล์จากนั้นใช้grepกับไฟล์นั้น เฉพาะเราไม่มีไฟล์เนื่องจากเราใช้ "การทดแทนกระบวนการ" ของ zsh

เพื่อแสดงภาพลอง

ps aux > ps.txt
grep fnord ps.txt
rm ps.txt

ผลลัพธ์ควรเหมือนกัน

ความคิดเห็นทั่วไปเกี่ยวกับคำตอบอื่น ๆ บางชนิดมีความซับซ้อนและ / หรือยาวกว่าพิมพ์ มันไม่เพียง แต่เป็นเรื่องของความถูกต้องเท่านั้น แต่ก็ควรใช้งานได้เช่นกัน แต่นั่นไม่ได้หมายความว่าวิธีแก้ปัญหาบางอย่างนั้นไม่ดี เพียง แต่ต้องห่อไว้ใน mini-UI เพื่อให้สามารถใช้งานได้


1
ไม่ทราบการทดแทนกระบวนการของ zsh แต่แน่ใจหรือไม่ว่ากระบวนการทั้งสองนั้นถูกเรียกหนึ่งกระบวนการต่อเนื่องกันและไม่ขนานกัน?
Paŭlo Ebermann

3
@ PaŭloEbermann: <(command)สำหรับคู่ขนานคือ grep grep =(ps aux)ไม่แสดงบรรทัดใด ๆ
Maciej Piechotka

Zsh ยังสามารถจับคู่เอาต์พุตจาก ps ได้อีกด้วย print -l ${(M)${(f)¨$(ps aux)¨}:#*fnord*}
Friartek

7
ps aux | grep $(echo fnord | sed "s/^\(.\)/[\1]/g")

3
ดูเหมือนว่าเป็น IOCCC แต่สำหรับบรรทัดคำสั่ง unix แทนที่จะเป็น C ^^ แค่| grep $(echo fnord)นั้นยังไม่พอเหรอ? คุณยังขอให้ sed เพื่อค้นหาและแทนที่อักขระแต่ละตัวใน "fnord" ด้วยค่าของมันเอง? ^^ ขอแสดงความยินดี ฉันพนันได้เลยว่าฉันจะทำได้นานกว่านี้ แต่มันอาจจะไม่ตลกเท่าไหร่ ^^
Olivier Dulac

1
ฉันขอโทษเนื่องจากน้ำเสียงของความคิดเห็นด้านบนของฉันอาจฟังดูไม่เหมาะสม (และฉันไม่สามารถแก้ไขได้หลังจาก 5mn) ... คำตอบของคุณเป็นการอ่านที่สนุกสนานและฉันไม่พยายามทำให้คุณดูแย่ ฉันคิดว่าคุณทำแบบนี้โดยตั้งใจ ^^
Olivier Dulac

1
อย่าขอโทษคำตอบของคุณสนุกกับการอ่านมาก (และตรงประเด็นด้วยเช่นกัน) ฉันหมายถึง pgrep -l $ 1 ต่อไป;)
yPhil

3
@OlivierDulac: เขาไม่เพียงแค่แทนที่อักขระตัวแรกด้วยค่าของมันเอง เขาแทนที่มันด้วยการต่อค่าของมันระหว่างวงเล็บเหลี่ยม (วงเล็บเหลี่ยมเหล่านั้นไม่พิเศษมันเป็นตัวอักษร) โดยทั่วไปแล้วเขาพูดถึงคำตอบของ Wayne Werner เพื่อให้สามารถวางสคริปต์รอบอักขระแรกได้ +1
LarsH

2
ps aux | grep '[^]]fnord'จะหลีกเลี่ยงยิมนาสติกที่
Stéphane Chazelas

6

คำตอบนี้ GNU ดูคำตอบของ Wayneสำหรับวิธีแก้ปัญหาทั่วไปเพิ่มเติม

กำลังค้นหากระบวนการ

หากคุณกำลังมองหาfnordกระบวนการคุณสามารถใช้-Cตัวเลือกเพื่อเลือกตามชื่อคำสั่ง:

ps -C fnord

สิ่งนี้สามารถผสมกับตัวเลือกการจัดรูปแบบ BSD- และสไตล์ POSIX ตามที่คุณต้องการ ดูหน้า man psสำหรับรายการทั้งหมด

กำลังมองหาอะไรสักอย่าง?

หากคุณต้องการบางสิ่งที่สูงกว่าการค้นหาชื่อคำสั่งอย่าหวังเอาไว้! ยังสามารถทำได้ที่psด้านข้างของท่อ สิ่งที่เราต้องทำคือบอกpsให้แยกgrepกระบวนการออกจากผลลัพธ์:

ps -NC grep | grep 'fnord'

-C grepเลือกกระบวนการ grep ทั้งหมดและ-Nคัดค้านการเลือก สามารถใช้เพื่อค้นหาอาร์กิวเมนต์คำสั่งส่วนหนึ่งของชื่อคำสั่งหรือนิพจน์ทั่วไปที่ซับซ้อนยิ่งขึ้น


1
สิ่งนี้ดีสำหรับ GNU psแต่-Cไม่ได้ระบุโดย POSIX และมีความหมายที่แตกต่างอย่างสิ้นเชิงกับ BSD
Eric Renouf

มันเป็นคนเกียจคร้านไม่มี BSD ที่เทียบเท่ากัน (ซึ่งหมายความว่ามันจะไม่ทำงานบน mac) การใช้ ps -C นั้นเป็นคำตอบที่ง่ายที่สุดสำหรับสิ่งเหล่านี้
Christopher Hunter

3

คำตอบของฉันคือรูปแบบของคำตอบทั่วไปสำหรับการค้นหา "foobar" ในรายชื่อ 'ps' อาร์กิวเมนต์ของ "-A" "ps" นั้นพกพาได้มากกว่า "aux" ฉันเชื่อ แต่การเปลี่ยนแปลงนี้ไม่เกี่ยวข้องกับคำตอบ คำตอบทั่วไปมีลักษณะดังนี้:

$ ps -A -ww | grep [f]oobar

ฉันใช้รูปแบบนี้แทน:

$ ps -A -ww | grep [^]]foobar

ข้อได้เปรียบหลักคือมันง่ายกว่าในการเขียนสคริปต์ตามรูปแบบนี้เพราะคุณเพียงแค่เชื่อมสตริงคงที่ "[^]]" กับรูปแบบใดก็ตามที่คุณกำลังมองหา คุณไม่จำเป็นต้องถอดอักษรตัวแรกของสตริงออกจากนั้นใส่ระหว่างเครื่องหมายวงเล็บเหลี่ยมแล้วต่อกลับเข้าด้วยกันอีกครั้ง เมื่อสคริปต์ในเชลล์ง่ายขึ้นเพียงแค่ติด "[^]]" ในด้านหน้าของรูปแบบที่คุณกำลังมองหาเพื่อหา การหั่นสตริงใน Bash เป็นสิ่งที่น่าเกลียดดังนั้นความแปรปรวนของฉันจึงหลีกเลี่ยง ชุดรูปแบบนี้บอกว่าแสดงเส้นที่รูปแบบตรงกันโดยไม่มีวงเล็บปีกกาขวานำ] เนื่องจากรูปแบบการค้นหาเพื่อแยกวงเล็บเหลี่ยมเพิ่มจริงวงเล็บเหลี่ยมสี่เหลี่ยมให้กับรูปแบบแล้วมันจะไม่ตรงกับตัวเอง

ดังนั้นคุณสามารถเขียนคำสั่ง 'psgrep' แบบพกพาได้ดังต่อไปนี้ ที่นี่ฉันให้ค่าเผื่อความแตกต่างระหว่าง Linux, OS X BSD และอื่น ๆ สิ่งนี้จะเพิ่มส่วนหัวคอลัมน์จาก 'ps' ให้รูปแบบ 'ps' ที่กำหนดเองได้มากขึ้นที่เหมาะสมกับความต้องการของฉัน betters และแสดงกระบวนการที่แสดงรายการที่กว้างเป็นพิเศษเพื่อไม่ให้มีการขัดแย้งในบรรทัดคำสั่ง ส่วนใหญ่ไม่ควรพลาด Java เป็น Java มันมักจะทำสิ่งต่าง ๆ ในวิธีที่แย่ที่สุดดังนั้นคุณจะต้องให้บริการ java บางอย่างผ่านความยาวสูงสุดของอาร์กิวเมนต์ที่ตารางกระบวนการจะติดตาม ฉันเชื่อว่านี่คือ 1024 ตัวอักษร ความยาวคำสั่ง - โลนที่ได้รับอนุญาตให้เริ่มกระบวนการมีความยาวมากขึ้น แต่ตารางกระบวนการเคอร์เนลไม่สนใจที่จะติดตามสิ่งใดที่มีความยาวเกิน 1K เมื่อคำสั่งเริ่มต้นขึ้นชื่อคำสั่งและรายการอาร์กิวเมนต์จะไม่ '

psgrep ()
{
    pattern=[^]]${1};
    case "$(uname -s)" in
        Darwin)
            ps -A -ww -o pid,ppid,nice,pri,pcpu,pmem,etime,user,wchan,stat,command | grep -i -e "^[[:space:]]*PID" -e ${pattern}
        ;;
        Linux)
            ps -A -ww -o pid,ppid,tid,nice,pri,pcpu,pmem,etime,user,wchan:20,stat,command | grep -i -e "^[[:space:]]*PID" -e ${pattern}
        ;;
        *)  # other UNIX flavors get a minimalist version.
            ps -A -ww | grep -i -e ${pattern}
        ;;
    esac
}

2

วิธีเชลล์ - ผู้ไม่เชื่อเรื่องพระเจ้าที่ง่ายที่สุดในการทำเช่นนี้คือเก็บไว้ในตัวแปรก่อน:

PS_OUTPUT="$(ps aux)"; echo "$PS_OUTPUT" |grep fnord

โทรออก: @ EmanuelBerg ของคำตอบคือไกลโดยที่หรูหราที่สุดแม้ว่ามันจะต้องใช้grep fnord =(ps aux) zshฉันมีมันสั้น ๆ ในไฟล์ rc ของฉัน แต่ทุบตีบ่นเกี่ยวกับไวยากรณ์ที่แม้จะมีเงื่อนไขที่ควรป้องกันการประเมินผลของมัน


จากไฟล์ rc ของฉันฉันมีรุ่นที่ไม่ตรงตามตัวพิมพ์

psl() {
  local PS_OUTPUT="$(ps auxww)"
  echo "${PS_OUTPUT%%$'\n'*}" >&2  # title, in stderr to avoid pipes
  echo "${PS_OUTPUT#*$'\n'}" |grep -i "${@:-^}"
}

การเดินโค้ดหนึ่ง bullet ต่อบรรทัดของรหัส:

  • จับpsเอาท์พุทverbose (ในlocalตัวแปรดังนั้นมันจะหายไปเมื่อฟังก์ชั่นกลับมา)
  • แสดงบรรทัดแรก (ชื่อเรื่อง) ด้วยข้อผิดพลาดมาตรฐานเพื่อให้สามารถกรองผลลัพธ์เพิ่มเติมได้โดยไม่กระทบกับชื่อเรื่อง การเปลี่ยนตัวผู้เล่นพูดว่า: ใช้เวลา$PS_OUTPUTและเอาทุกอย่างหลังจากฟีดบรรทัดแรก (equiv regex: s/\n.*$//msg) สิ่งนี้ทำให้เราไม่สามารถโลดชื่อเรื่องได้
  • แสดงpsเอาต์พุตพร้อมทุกอย่างยกเว้นบรรทัดแรก (regex equiv:) s/^.*\n//mและ grep เนื้อหาด้วย-icase-insensitive และอาร์กิวเมนต์ทั้งหมดส่งฟังก์ชันนี้ (ในกรณีที่ไม่มีอาร์กิวเมนต์^ซึ่งตรงกับจุดเริ่มต้นของบรรทัดใด ๆ ที่ตรงกัน ทุกอย่าง)

1

อาจถึงเวลาที่จะใช้ลำดับจริงในครั้งนี้ การใช้ท่อทำให้ขนาน

ps aux >f && grep tmpfs <f

น่าเกลียดเพราะจะมีไฟล์fแต่ไม่ใช่ความผิดของฉันที่ไม่มีไวยากรณ์สำหรับกระบวนการตามลำดับที่คุณยังต้องการใช้ผลลัพธ์ของกระบวนการที่ทำงานก่อนหน้านี้

คำแนะนำสำหรับไวยากรณ์ของตัวดำเนินการตามลำดับ:

ps aux ||| grep tmpfs

การไร้ความสามารถของคนทั่วไปในการกรองกระแสได้อย่างง่ายดายแทบจะไม่เหตุผลสำหรับชนชั้นสูงที่จะยึดตัวเองด้วยลำดับ มันจะเป็นขั้นตอนย้อนหลังในการคำนวณ
คิวเมนตัส

@ABB en.wikipedia.org/wiki/Communicating_sequential_processesมีตัวดำเนินการมากกว่าผู้ที่จบลงด้วยเปลือก Thompson อาจมีเพียงโอเปอเรเตอร์ที่เรียงตามลำดับและซึ่งสื่อสารผลลัพธ์ไปยังกระบวนการถัดไปในลำดับทันทีที่ออก "ย้อนกลับขั้นตอนในการคำนวณ" โดยการให้โอเปอเรเตอร์เพิ่มเติมดูเหมือนจะรุนแรง
Anne van Rossum

การเชื่อมโยงที่ดี แต่แน่นอนว่าการประมวลผลตามลำดับนั้นแย่กว่าในการใช้ CPU และหน่วยความจำ (หรือดิสก์) - สัมพันธ์กับการประมวลผลแบบขนาน ในกรณีนี้ถ้าฉันต้องเก็บpsผลลัพธ์ทั้งหมดก่อนฉันgrepฉันจะใช้หน่วยความจำเพิ่มเติม (หรือดิสก์) นานขึ้น
คิวเมนตัส

0

คำสั่ง pgrep ตามที่คนอื่นได้ระบุไว้จะส่งคืน PID (ID กระบวนการ) ของกระบวนการตามชื่อและคุณลักษณะอื่น ๆ ตัวอย่างเช่น,

pgrep -d, -u <username> <string>

ที่จะทำให้คุณ PIDs, คั่นด้วยเครื่องหมายจุลภาค (,) <username>ของกระบวนการทั้งหมดที่มีชื่อตรงกับที่ถูกเรียกใช้โดยผู้ใช้ คุณสามารถใช้สวิตช์ -x ก่อนที่จะส่งคืนการแข่งขันที่แน่นอนเท่านั้น

หากคุณต้องการได้รับข้อมูลเพิ่มเติมเกี่ยวกับกระบวนการเหล่านี้ (เช่นการเรียกใช้ตัวเลือก aux จาก ps implies) คุณสามารถใช้ตัวเลือก -p กับ ps ซึ่งจับคู่กับ PID ตัวอย่างเช่น

ps up $(pgrep -d, -u <username> <string>)

จะให้ข้อมูลโดยละเอียดเกี่ยวกับ PID ทั้งหมดที่จับคู่โดยคำสั่ง pgrep


psล้มเหลวหากpgrepส่งคืนชุดที่ว่างเปล่า ฉันมีคำตอบที่สร้างต่อคุณและพยายามแก้ไขปัญหานี้
คิวเมนตัส

0

นี่คือตัวอย่างง่ายๆในการค้นหา PID ssh-agentสำหรับชื่อผู้ใช้โดยไม่แสดง PID ของgrepกระบวนการเอง:

ps xu | grep "${USER}.*[ ]/usr/bin/ssh-agent" | awk '{print $1 $2;}'

หากคุณต้องการตัวอย่างเพื่อฆ่าssh-agentผู้ใช้ปัจจุบันคุณอาจใช้คำสั่งต่อไปนี้:

kill `ps xu | grep "${USER}.*[ ]/usr/bin/ssh-agent" | awk '{print $2;}'`

ในการสร้างนามแฝงที่มีประโยชน์ให้เพิ่มไฟล์ ~ / .bashrc หรือ ~ / .zshrc ของคุณด้วยรหัสต่อไปนี้:

function function1 () {
    ps xu | grep "$1.*$2" | awk '{print $1" "$2" "$11;}'
}
alias mygrep="function1"

และเพื่อใช้นามแฝงที่นี่เป็นตัวอย่างเพื่อบังคับให้ทุกคนเรียนรู้การแสดงออกปกติ:

. /etc/profile #to make alias usable
mygrep ${USER} ${PROCESS_PATH}
mygrep ${USER} "[f]nord"
mygrep "[f]nord"
mygrep ".*[s]shd"

PS ฉันทดสอบเฉพาะคำสั่งเหล่านี้ใน Ubuntu และ Gentoo เท่านั้น


(1) คำถามไม่ได้บอกว่าผู้ใช้กำลังมองหาหนึ่งในกระบวนการของเขาเอง - ผู้ใช้อาจไม่รู้จักเจ้าของกระบวนการที่เขากำลังมองหา (2) "${USER}.* /usr/bin/ssh-agent"ในฐานะที่เป็นแฟนซีเป็นคำตอบนี้คือมันจะยังคงล้มเหลวถ้าคุณได้กล่าวว่า มันทำงานได้เพราะคุณกล่าวว่า[ ]; เช่นคุณเพียงแค่ใช้กลไกของคำตอบที่ได้รับการยอมรับ grep "[s]sh-agent"คุณอาจได้เป็นอย่างดีเพียง
G-Man

คุณพูดถูก (1) ฉันแบ่งปันสิ่งที่อาจมีประโยชน์เมื่อฉันพบว่าตัวเองกำลังเผชิญหน้ากับหน้านี้นาน ๆ ครั้ง (2) ใช่ฉันใช้การแสดงออกปกติตามคำตอบที่ยอมรับ (3) ฉันอัปเดตคำตอบของฉันให้เหมือนกันกับยอมรับว่าดีกว่า แต่ฉันยังแสดงให้เห็นถึงวิธีการทำและนามแฝงที่จะใช้กับชื่อผู้ใช้ที่มีหรือไม่มีก็ได้ (4) ยังแสดงวิธีการกำหนดฟังก์ชั่นแม้ว่าจะไม่จำเป็น แต่ทำงานในวิธีที่น่าสนใจเนื่องจาก $ 1 และ $ 2 ไม่ทับซ้อนกัน ขอบคุณ # G-Man
Constantin Zagorsky

-1

คุณสามารถทำได้อย่างง่ายดายเพียงกำหนด ALIAS ใน.bashrc แบบนี้:

alias grep='grep -v grep | grep'

ไม่แน่ใจว่าใครลงคะแนนหรือทำไม แต่สิ่งนี้ช่วยให้คุณใช้เต็มรูปแบบของ ps ที่ pgrep ไม่ได้
opticyclic

ไม่เพียงแค่นี้โดยไม่ได้ตั้งใจยกเว้นกระบวนการ grep อื่น ๆ ; มันยังแบ่งgrepการใช้งานในกรณีอื่น ๆ ลองecho I love grep | grep loveดู
trosos

@trosos เกือบ 11 ปีฉัน * nix-ing .. และไม่เคยใช้รูปแบบนั้นเลย ... อาจจะปีหน้า - ใครจะรู้
a20

-1

การใช้ตัวเลือก -x (การทำงานแบบตรงทั้งหมด) ใช้งานได้สำหรับฉัน ฉันรวมกับ -f (บรรทัดคำสั่งเต็ม) ดังนั้นฉันสามารถจับคู่กระบวนการของฉันอย่างแม่นยำด้วย:

pgrep -x -f "path_i_used_when_starting/cmd params_i_used"

ใครก็ตามที่กำลังทำโดยการ downvoting จะอธิบายตัวเอง? นี่คือการทำงานเพื่อแก้ไขปัญหานี้สำหรับฉันโดยไม่ล้มเหลวมานานหลายปี
moodboom
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.