ทางเลือกสำหรับ 'egrep -o“ สำเร็จ | ข้อผิดพลาด | ล้มเหลว” <filename> | จัดเรียง | uniq -c '


8

บางครั้งฉันต้องตรวจสอบบันทึกและฉันทำสิ่งนี้ด้วยคำสั่งนี้:

egrep -o "success|error|fail" <filename> | sort | uniq -c

ตัวอย่างอินพุต:

test error on line 10
test connect success
test insert success
test started at 00:00
test delete  fail

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

1 error
1 fail
2 success

ฉันต้องการที่จะรู้ว่าถ้ามีคนรู้วิธีที่จะทำเช่นนี้ด้วยคำสั่งที่สั้นกว่า?

ก่อนที่คุณจะถามว่าทำไมฉันถึงต้องการทำสิ่งนี้ด้วยคำสั่งต่าง ๆ ... ไม่มีเหตุผลพิเศษฉันแค่อยากรู้ว่า :)

คำตอบ:


4

นี่คือawkวิธีการทำ

awk 'BEGIN{RS=" "}/success/{s++}/fail/{f++}/error/{e++}END{print "Success:"s" Failed:"f" Error:"e}' abc

แต่เรือเดินสมุทรเหล่านี้ทั้งหมดจะยาวไปหน่อยกว่าเก่าดีของเรา grep


4

ไม่ฉันคิดว่าคุณทำได้ดีเท่าที่ควร โดยธรรมชาติคุณสามารถทำได้ด้วยสคริปต์บทเดียว

perl -nle  's/.*(error|fail|success).*/$1/ && $a{$_}++ ; END {  print "$_ $a{$_}" for keys %a } ' test.txt

... แต่มันซับซ้อนและหยั่งรู้น้อยกว่า


ฉันเพิ่มตัวอย่างอินพุตให้กับคำถามของฉัน ... หวังว่าตอนนี้จะชัดเจนยิ่งขึ้นว่าคำสั่งทำ ... sory สำหรับความไม่สะดวก
Wolfy

1
ตกลงฉันแก้ไข perl oneliner ตามนั้น ฉันยังคิดว่าโซลูชันของคุณที่มี egrep ดีกว่าและใช้งานง่ายขึ้น
มกราคม

2

ไม่สั้นมากนัก แต่เนื่องจากคุณไม่ต้องการนิพจน์ทั่วไปจึงมีfgrep( grep -F)

fgrep 'success
error
fail' "$filename" | sort | uniq -c

อีกวิธีในการเขียนสิ่งเดียวกันใน bash:

fgrep $'success\nerror\nfail' "$filename" | sort | uniq -c

1

คุณสามารถเขียนสคริปต์ทุบตีง่ายแล้วเรียกสคริปต์เช่น:

#!/bin/bash
egrep -o "success|error|fail" "$1" | sort | uniq -c

และบันทึกเป็น myscript.sh(ตัวอย่าง) จากนั้นทำและคุณสามารถเรียกมันเช่นchmod +x myscript.shmyscript.sh <filename>


แต่ในกรณีนี้คำสั่งเดียวกัน ... คุณเพิ่งสร้างสคริปต์ที่เรียกคำสั่ง ...
Wolfy

ฉันคิดว่าคุณแค่ต้องการเพิ่มความเร็วในบันทึกของคุณ แค่อยากรู้อยากเห็นทำไมคุณถึงต้องการคำสั่งทางเลือกถ้าสิ่งที่คุณได้ให้มานั้นเป็นสิ่งที่ดีสำหรับคุณ?
jeremija

อย่างที่ฉันพูด: ฉันแค่อยากรู้อยากเห็นว่าคนอื่นทำอะไรแบบนั้น ... หลายครั้งที่ฉันรู้ว่าผู้คนรู้วิธีที่จะทำสิ่งต่าง ๆ ที่สวยงาม / ฉันชอบที่จะเรียนรู้วิธีทำสิ่งต่าง ๆ ...
Wolfy

2
ในกรณีนี้คุณเป็นคนนั้น :-) บรรทัดคำสั่งของคุณดี, กระชับ, ชัดเจนและใช้ประโยชน์จากพลังของบรรทัดคำสั่ง Unix มีอะไรอีกที่ปรารถนา
มกราคม

0

คำสั่งของคุณในขณะที่สั้นและหวานเป็นวิธีค่อนข้างอ้อมค้อมนับเหตุการณ์ที่เกิดขึ้นของคำ ฉันอาจจะใช้ทู่ตรงเข้าหาและใช้ grep's -c flag (ซึ่งทำอย่างนั้น) ภายใน shell loop:

for i in success test fail; do echo `grep -c $i <filename>` $i; done

ไม่สั้นไม่น่าตื่นเต้นและอาจเร็วกว่าสำหรับไฟล์บันทึกขนาดใหญ่ (ไม่sort) ฉันว่ามันเป็นการล้าง


-1

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

เราสามารถย่อให้สั้นได้หากบางคนสามารถเข้าถึงได้ด้วยตัวเลือกบางอย่างgrepแต่ฉันไม่เห็นว่า ... :)


2
ไม่ไม่ใช่มิฉะนั้น uniq จะนับอินสแตนซ์ของข้อความค้นหาติดต่อกันเท่านั้น เช่นถ้าคุณมีความสำเร็จความสำเร็จล้มเหลวสำเร็จแล้วผลลัพธ์ของ uniq จะเป็น2 success 1 fail 1 successเช่นนั้น
มกราคม

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