วิธี grep ps เอาท์พุทที่มีส่วนหัว


26

ฉันจะ grep เอาต์พุต PS โดยมีส่วนหัวอยู่ได้อย่างไร

กระบวนการทั้งสองนี้ประกอบกันเป็นแอปที่ทำงานบนเซิร์ฟเวอร์ของฉัน ....

root     17123 16727  0 16:25 pts/6    00:00:00 grep GMC
root     32017     1 83 May03 ?        6-22:01:17 /scripts/GMC/PNetT-5.1-SP1/PNetTNetServer.bin -tempdir /usr/local/GMC/PNetT-5.1-SP1/tmpData -D

ไม่6-22:01:17ได้หมายความว่าจะได้รับการทำงานเป็นเวลา 6 วัน? ฉันกำลังพยายามกำหนดความยาวของกระบวนการที่ใช้ ...

คอลัมน์ที่ 2 เป็นรหัสกระบวนการหรือไม่ ดังนั้นถ้าฉันทำkill 32017มันจะฆ่ากระบวนการที่ 2?

คำตอบ:


37
ps -ef | egrep "GMC|PID"

แทนที่ "GMC" และpsสวิตช์ตามต้องการ

ตัวอย่างผลลัพธ์:

root@xxxxx:~$ ps -ef | egrep "disk|PID"

UID        PID  PPID  C STIME TTY          TIME CMD
paremh1  12501 12466  0 18:31 pts/1    00:00:00 egrep disk|PID
root     14936     1  0 Apr26 ?        00:02:11 /usr/lib/udisks/udisks-daemon
root     14937 14936  0 Apr26 ?        00:00:03 udisks-daemon: not polling any devices

8
การเพิ่มข้อมูลเกี่ยวกับ 'ทำไม' จึงเป็นสิ่งที่ดี
Elijah Lynn

2
ไม่นั่นเป็นการออกกำลังกายสำหรับผู้ใช้
Hyppy

@ElijahLynn มันตรงกับข้อความในส่วนหัว - ในกรณีนี้ PID แต่คุณสามารถสลับออกสำหรับการโพสต์, PTIME หรือสิ่งอื่นใดในส่วนหัว ...
เบนครีซี่

5
ดังนั้นจึงps -eเลือกกระบวนการทั้งหมดและps -fเป็นรายการแบบเต็มรูปแบบซึ่งแสดงส่วนหัวของคอลัมน์ จากนั้นเราจะทำการโยงส่วนหัวของคอลัมน์และเอาท์พุทไปยัง egrep ซึ่งเป็นการขยาย grep และอนุญาตให้ไพพ์|มีความหมายพิเศษซึ่งก็คือ OR (อันนี้หรืออย่างนั้น) ดังนั้นคุณจะต้องจับคู่ PID ในส่วนหัวคอลัมน์พร้อมกับบรรทัดผลลัพธ์
Elijah Lynn

ฉันต้องใช้เครื่องหมายคำพูดธรรมดาในคำสั่ง egrep / grep -E ใน Ubuntu 16.04 เช่น: ps -ef | grep -E 'GMC|PID'
Vlax

13

ขอบคุณ geekosaur ฉันต้องการใช้คำสั่งนี้สำหรับความต้องการของคุณมากกว่าคำสั่งที่แยกจากกัน:

ps -ef | head -1; ps -ef | grep "your-pattern-goes-here"

สิ่งที่ยุ่งยากคือการใช้ประโยชน์จาก ";" สนับสนุนโดยเชลล์เพื่อโยงคำสั่ง


นี่คือสะอาดและแข็งแกร่งกว่าคำตอบที่ยอมรับ ไม่ยืนยันว่าส่วนหัวมี PID อยู่ในนั้นและไม่เพิ่มความซับซ้อนให้กับสตริง grep
7yl4r

2
เดี๋ยวก่อน ... คุณได้รับps -efซ้ำแล้วซ้ำอีก ยิ่งไปกว่านั้นคือps -ef | { head -1 ; grep "your-pattern" ; }
7yl4r

@ 7yl4r ไม่เคยใช้ความสามารถของเชลล์นั้น ฉันลองคำสั่งที่ปรับปรุงแล้วของคุณทำงานได้อย่างสมบูรณ์! ได้เรียนรู้แล้ว :)
Vic Lau

3
พบคำอธิบายเกี่ยวกับเทคนิคนี้ที่เรียกว่า 'คำสั่งการจัดกลุ่ม' สำหรับความอยากรู้ของผู้อื่นโปรดดูที่: gnu.org/software/bash/manual/html_node/Command-Grouping.html
Vic Lau

@ 7yl4r เทคนิคที่ยอดเยี่ยม! ฉันกำลังมองหาวิธีที่จะไม่ทำซ้ำคำสั่ง ps -ef | { head -1; grep "pattern" | head -5; }คำสั่งจัดกลุ่มสามารถแม้แต่จะได้รับการประปา: มีประโยชน์ถ้ารูปแบบ grep-ed มีผลลัพธ์จำนวนมาก!
ติด

6

คอลัมน์ที่สองคือรหัสกระบวนการ อันดับที่ 4 คือเมื่อกระบวนการถูกสร้างขึ้น (โดยปกติจะเป็นเวลาที่โปรแกรมของคุณเริ่มต้น แต่ไม่เสมอไปพิจารณาexecve()และเป็นเพื่อน) 6th คือจำนวนเวลา CPU ที่ใช้ ดังนั้นมันจึงทำงานมา 8 วันและใช้เวลา CPU เกือบ 7 วันซึ่งฉันคิดว่าน่าเป็นห่วง

การรับส่วนหัวในการภาวนาเดียวกันนั้นเป็นเรื่องที่ดีที่สุด ps | head -1ฉันต้องการเพียงแค่ทำแยกต่างหาก คุณอาจลองใช้psวิธีการเลือกของตัวเองหรืออะไรทำนองนั้นpgrepแทนgrepซึ่งไม่ได้ออกแบบมาเพื่อส่งผ่านส่วนหัว


อะไร83?
Webnet

ลำดับความสำคัญของกระบวนการปัจจุบันซึ่งขึ้นอยู่กับการใช้งาน CPU และ I / O ที่ผ่านมาและniceค่าที่กำหนดโดยผู้ใช้หรือระบบ หมายเลขที่เล็กกว่านั้นจะมีลำดับความสำคัญสูงกว่า ในกรณีนี้grepคือระดับความสำคัญ 0 เนื่องจากถูกบล็อกบนดิสก์อ่านและให้ผลผลิตเพื่อเขียนเอาต์พุตและPNetTNetServer.binเป็นจำนวนมากเนื่องจากมันใช้เวลาอย่างต่อเนื่องโดยไม่มีการปิดกั้น (การจัดตารางเวลาที่มีความซับซ้อนและรายละเอียดจะขึ้นอยู่กับกำหนดการที่แน่นอนถูกนำมาใช้.)
geekosaur

5

วิธีการแก้ปัญหา egrep นั้นง่ายและมีประโยชน์ แต่แน่นอนว่าคุณขึ้นอยู่กับส่วนหัวที่มี 'PID' อยู่เสมอ (ซึ่งเป็นข้อสันนิษฐานที่สมเหตุสมผลมากกว่า) และสตริงเดียวกันไม่เกิดขึ้นที่อื่น ฉันเดาว่านี่เพียงพอสำหรับความต้องการของคุณ แต่ในกรณีที่มีคนต้องการตัวเลือกอื่น

Sed ช่วยให้คุณเพียงแค่พูดว่า "พิมพ์บรรทัดแรกจากนั้นบรรทัดใด ๆ ที่มีรูปแบบ" ตัวอย่างเช่น:

ps auxwww | sed -n '1p; /PROCESS_NAME_TO_SEARCH/p;'

เพิ่ม/sed -n/d;เพื่อกรองตัวเองออก:

ps auxwww | sed -n '1p; /sed -n/d; /PROCESS_NAME_TO_SEARCH/p;'

/sed -n/dไม่ถูกต้อง บางคำสั่งที่มีอยู่อาจมีsed -nซึ่งคุณต้องการพิมพ์ sed -n '1p; /[P]ROCESS_NAME_TO_SEARCH/p'เคล็ดลับคือการใช้งาน ;-) สังเกต[]รอบอักขระใด ๆ ในสตริงการค้นหา
anishsane

4

ทางเลือกที่ง่ายขึ้น: ps -ef | { head -1; grep GMC; }

แทนที่หมายเลขด้วยจำนวนบรรทัดที่ส่วนหัวของคุณแสดง


1
ฉันชอบวิธีนี้ แต่คำสั่งต้องการเซมิโคลอนอื่นในตอนท้าย ps -ef | { head -1; grep GMC; }. นอกจากนี้ฉันชอบมันในฟังก์ชั่นดังต่อไปนี้:function pgrep() { ps -ef | { head -1; grep $@; } }
Brett

1

คุณสามารถรับ pid ด้วย pgrep

pgrep PNetTNetServer

แล้วใช้ ps กับ pid

ps u 12345

หรือรวมทั้งสองเป็นหนึ่งคำสั่ง

ps u `pgrep PNetTNetServer`

นี่จะแสดงเฉพาะบรรทัดที่คุณต้องการและรวมส่วนหัว


0

ฉันเขียนโปรแกรม Perl ขนาดเล็กที่จะพิมพ์

  • บรรทัดแรกและการจับคู่บรรทัดทั้งหมดหากมีการจับคู่ใด ๆ หรือ
  • ไม่มีอะไรเลยถ้าไม่มีการแข่งขัน

ฉันมักจะใช้มันชอบps | 1andre GMCแต่ก็สามารถใช้อาร์กิวเมนต์ไฟล์ (แต่ละไฟล์มีบรรทัดส่วนหัวของตัวเองสำหรับการจับคู่ที่ทำในบรรทัดจากไฟล์นั้น)



#!/usr/bin/perl

#
# 1andre <regexp> [<file> ...]
#
#   1 -           first ({1}st)
# and -                  {and}
#  re - (lines matching) {re}gexp
#
# If no <files> are given (or "-" is given as a <file>) stdin is
# used.
#
# If any lines from each <file> match the <regexp>, print the
# first line from that <file> and all the matching lines from
# that <file>.
#

use strict;
use warnings;

if(scalar @ARGV < 1) {
  printf STDERR "usage: %s <regexp> [<file> ...]\n", $0;
  exit 1;
}

my $re = shift;
my $header;

while(<>) {
  if($. == 1) {
    $header = $_;
  } elsif(m/$re/) {
    if(defined $header) {
      print $header;
      undef $header;
    }
    print;
  }
} continue {
  # close resets $. when we get to the end of each file that <> is processing
  close ARGV if eof;
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.