ฉันเรียกใช้คำสั่งต่อไปนี้:
grep -o "[0-9] errors" verification_report_3.txt | awk '{print $1}'
และฉันได้รับผลลัพธ์ต่อไปนี้:
1
4
0
8
ฉันต้องการเพิ่มตัวเลขแต่ละตัวให้เป็นตัวแปรนับที่รันอยู่ มีเวทมนต์ที่ใครบางคนสามารถช่วยฉันสร้างได้หรือไม่?
ฉันเรียกใช้คำสั่งต่อไปนี้:
grep -o "[0-9] errors" verification_report_3.txt | awk '{print $1}'
และฉันได้รับผลลัพธ์ต่อไปนี้:
1
4
0
8
ฉันต้องการเพิ่มตัวเลขแต่ละตัวให้เป็นตัวแปรนับที่รันอยู่ มีเวทมนต์ที่ใครบางคนสามารถช่วยฉันสร้างได้หรือไม่?
คำตอบ:
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 }'
variable=$(grep -o "[0-9] errors" verification_report_3.txt | awk '{ SUM += $1} END { print SUM }')
สิ่งนี้ทำให้เอาท์พุทของคำสั่ง (ซึ่งเป็นเพียงผลรวมค่า) ลงในตัวแปรที่เรียกว่าvariable
"[0-9]\+ errors"
ของคุณเพื่อ สิ่งนี้จะตรงกันหากคุณมีการรายงานสาย> 9 ข้อผิดพลาด
ทั้งหมดนี้สามารถทำได้ใน awk เช่นกัน:
awk '"[0-9]+ errors" {sum += $1}; END {print sum}' verification_report_3.txt
ดูเหมือนว่าคุณกำลังใช้ระบบ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
ลองใช้ท่อจาก grep ของคุณเข้าไป
awk 'BEGIN {total=0;}{total+=$1;}END {print "Total: ",total}'
ฉันใช้สิ่งนี้:
$ 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; }
คุณสามารถแทนที่เครื่องหมายสิ้นสุดของบรรทัดสำหรับตัวคั่นองค์ประกอบที่เฉพาะเจาะจงหรือคลาสอักขระได้หากข้อมูลของคุณถูกคั่นด้วยวิธีอื่น