Menambahkan angka dari hasil grep


23

Saya menjalankan perintah berikut:

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

dan saya mendapatkan hasil berikut:

1
4
0
8

Saya ingin menambahkan masing-masing angka hingga variabel penghitungan berjalan. Apakah ada satu kapal ajaib yang bisa saya bantu buat?

Jawaban:


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

Itu tidak mencetak daftar tetapi mencetak jumlahnya. Jika Anda ingin daftar dan jumlah, Anda dapat melakukan:

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

Shawn - terima kasih atas jawaban Anda. Bagaimana cara mengembalikan total kembali ke skrip bash dari awk?
Amir Afghani

2
@Amir Anda akan menggunakan yang pertama seperti ini. variable=$(grep -o "[0-9] errors" verification_report_3.txt | awk '{ SUM += $1} END { print SUM }')Ini menempatkan output dari perintah (yang hanya nilai penjumlahan) ke dalam variabel yang disebutvariable
Shawn J. Goff

3
@Amir Afghani Juga, Anda mungkin ingin mengubah grep Anda "[0-9]\+ errors". Ini akan cocok jika Anda memiliki pelaporan garis> 9 kesalahan.
Shawn J. Goff

Yup, wow aku tidak percaya aku melewatkan itu. Terima kasih.
Amir Afghani

Shawn, hasilnya sepertinya tidak menambah hasil saya. Kelihatannya seperti ini: Total Kesalahan = + 259 + 7581 + 8852 + 2014 + 3189 ++ 13572 + 11438 +++ 6 + 4172 +
Amir Afghani

8

Ini semua bisa dilakukan dengan awk juga:

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

6

Anda tampaknya menggunakan sistem GNU , jadi jika Perl dukungan ekspresi reguler tersedia, Anda dapat menulis sesuatu seperti ini:

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

PS Saya mengubah ekspresi reguler (menambahkan + quantifier) ​​untuk memungkinkan angka> 9.

PS Atau, awk sudah cukup (dengan asumsi GNU awk ):

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

yang pertama untuk saya baru saja mencetak apa yang sudah masuk ke pipa ...
Xerus

3

Coba perpipkan output dari grep Anda

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

2

Saya menggunakan ini:

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

Ini tidak efisien untuk daftar besar, tetapi untuk sebagian besar kasus penggunaan saya baik-baik saja. Saya biasanya menggunakan fungsi shell untuk mengotomatiskan proses sehingga saya hanya perlu memberikan nama file:

## 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; }

Anda selalu dapat mengganti penanda garis akhir untuk pemisah elemen tertentu atau kelas karakter jika data Anda dibatasi dengan cara lain.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.