การเพิ่มตัวเลขจากผลลัพธ์ของ grep


23

ฉันเรียกใช้คำสั่งต่อไปนี้:

grep -o "[0-9] errors" verification_report_3.txt | awk '{print $1}'

และฉันได้รับผลลัพธ์ต่อไปนี้:

1
4
0
8

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

คำตอบ:


31
grep -o "[0-9] errors" verification_report_3.txt | awk '{ SUM += $1} END { print SUM }'

ไม่ได้พิมพ์รายการ แต่พิมพ์ผลรวม หากคุณต้องการทั้งรายการและผลรวมคุณสามารถทำได้:

grep -o "[0-9] errors" verification_report_3.txt | awk '{ SUM += $1; print $1} END { print SUM }'

Shawn - ขอบคุณสำหรับคำตอบของคุณ ฉันจะคืนค่าทั้งหมดกลับไปที่สคริปต์ทุบตีได้อย่างไรจาก awk?
Amir Afghanani

2
@Amir คุณจะใช้อันแรกเช่นนี้variable=$(grep -o "[0-9] errors" verification_report_3.txt | awk '{ SUM += $1} END { print SUM }')สิ่งนี้ทำให้เอาท์พุทของคำสั่ง (ซึ่งเป็นเพียงผลรวมค่า) ลงในตัวแปรที่เรียกว่าvariable
Shawn J. Goff

3
@Amir อัฟกานิสถานนอกจากนี้คุณอาจต้องการที่จะเปลี่ยน grep "[0-9]\+ errors"ของคุณเพื่อ สิ่งนี้จะตรงกันหากคุณมีการรายงานสาย> 9 ข้อผิดพลาด
Shawn J. Goff

ใช่ว้าวฉันไม่อยากจะเชื่อเลยว่าฉันคิดถึงเรื่องนั้น ขอขอบคุณ.
อาเมียร์อัฟกานี

Shawn ผลลัพธ์ดูเหมือนจะไม่ได้เพิ่มผลลัพธ์ของฉัน ดูเหมือนว่า: ข้อผิดพลาดทั้งหมด = + 259 + 7581 + 8852 + 2014 + 3189 ++ 13572 + 11438 +++ 6 + 4172 +
Amir Afghani


6

ดูเหมือนว่าคุณกำลังใช้ระบบGNUดังนั้นหากการสนับสนุนนิพจน์ปกติของPerlพร้อมใช้งานคุณสามารถเขียนดังนี้:

grep -Po '[0-9]+(?=\s+errors)' infile | 
  paste -sd+ | 
    bc

PS ฉันแก้ไขการแสดงออกปกติ (เพิ่ม + ปริมาณ) เพื่อให้ตัวเลข> 9

ป.ล. หรือ awk ก็เพียงพอแล้ว (สมมติว่าGNU awk ):

awk 'END { print s }
/[0-9]+[[:space:]]+errors/ { 
  s += $1 
  }' infile

คนแรกสำหรับฉันเพียงแค่พิมพ์สิ่งที่มีอยู่แล้วเดินเข้าไปในท่อ ...
Xerus

3

ลองใช้ท่อจาก grep ของคุณเข้าไป

awk 'BEGIN {total=0;}{total+=$1;}END {print "Total: ",total}'

2

ฉันใช้สิ่งนี้:

$ echo $(cat file | sed 's/$/+/') 0 | bc

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

## cheezy summation
##   call from .bashrc
##
getsum () { echo $(cat $1 | sed 's/$/+/') 0 | bc; }
gethsum () { echo $(cat $1 | sed 's/[gG]/*1000M/' | sed 's/[mM]/*1000K/' | sed 's/[kK]/*1000/' | sed 's/$/+/') 0 | bc; }
gethexsum () { echo ibase=16 $(cat $1 | sed 's/$/+/') 0 | bc; }

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

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