Saya mengalami kesalahan saat menggunakan gawk. Di bawah ini adalah skrip saya dan file contoh Bisakah kalian membantu saya? Saya pikir regex benar tetapi ada kesalahan ketika diteruskan ke fungsi pertandingan. Saya mencoba berbagai pendekatan seperti memberikan \ ke karakter khusus regex atau double .

$cat script.sh

#!/bin/bash
gawk '
BEGINFILE{
        while( getline < FILENAME > 0 ){
                print match($0, /[0-9]+\.[0-9]+(?= ops/s)/)
                print $0
        }
}
' ./file

$ file kucing

123.456: IO Summary: 123456 ops 1234.567 ops/s 100/100 rd/wr   1.0mb/s 1.111ms/op

$sh script.sh

gawk: cmd. line:4: error: Unmatched ( or \(: /[0-9]+\.[0-9]+(?= ops/
3
laurent01 5 Januari 2021, 09:31

3 jawaban

Jawaban Terbaik

Regex di awk atau gnu-awk tidak mendukung lookaheads. Anda dapat menggunakan perintah gnu-awk alternatif ini:

awk 'match($0, /([0-9]+\.[0-9]+) ops\/s/, m) {print m[1]}' file

1234.567

Berikut adalah perintah awk yang sesuai dengan POSIX untuk melakukan hal yang sama:

awk 'match($0, /[0-9]+\.[0-9]+ ops\/s/) {
   print substr($0, RSTART, RLENGTH-6)}' file

1234.567

Namun jika ada beberapa kecocokan per baris maka gunakan:

awk '{
   s = $0
   while (match(s, /([0-9]+\.[0-9]+) ops\/s/, m)) {
      print m[1]
      s = substr(s, RSTART + RLENGTH)
   }
}' file
4
anubhava 5 Januari 2021, 06:37

Dengan sampel yang Anda tunjukkan, bisakah Anda mencoba mengikuti. Ini harus cocok dengan digit dengan dan tanpa floating point di sini.

awk '
match($0,/[0-9]+(\.[0-9]+)? +ops\/s/){
  val=substr($0,RSTART,RLENGTH)
  sub(/ .*/,"",val)
  print val
}
'  Input_file

Penjelasan: Menambahkan penjelasan rinci di atas.

awk '                                     ##Starting awk program from here.
match($0,/[0-9]+(\.[0-9]+)? +ops\/s/){    ##using match function to match regex [0-9]+(\.[0-9]+)? +ops\/s in current line.
  val=substr($0,RSTART,RLENGTH)           ##Creating val variable here which has sub string of matched regex from current line.
  sub(/ .*/,"",val)                       ##Substituting everything from space to till last with NULL in val here.
  print val                               ##Printing val here.
}
' Input_file                              ##Mentioning Input_file name here.
4
RavinderSingh13 5 Januari 2021, 06:50

Awk lain dengan loop for untuk memperlambatnya alih-alih regex. Ini menampilkan kecocokan dan catatan seperti while Anda dalam kode contoh. Jika saya salah mengartikan niat Anda, harap perbarui output yang diharapkan ke pertanyaan awal:

$ awk '{
    for(i=2;i<=NF;i++)        # loop from second field to the end
        if($i=="ops/s")       # if ith field is ops/s
            print $(i-1)      # print previous field
}1' file                      # output the record

Keluaran:

1234.567
123.456: IO Summary: 123456 ops 1234.567 ops/s 100/100 rd/wr   1.0mb/s 1.111ms/op
2
James Brown 5 Januari 2021, 08:50