คำตอบของฉันคือรูปแบบของคำตอบทั่วไปสำหรับการค้นหา "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
}
ps aux |grep
ด้วยpgrep
(หรือpgrep -f
)