Latest web development tutorials

perintah awk linux

perintah awk linux

Linux perintah Daquan Linux perintah Daquan

AWK adalah file teks pengolahan bahasa, analisis teks adalah alat yang ampuh.

AWK dipanggil karena butuh tiga pendiri Alfred Aho, Peter Weinberger, dan Brian Kernighan dari Nama Keluarga dari karakter pertama.

tatabahasa

awk [选项参数] 'script' var=value file(s)
或
awk [选项参数] -f scriptfile var=value file(s)

Pilihan Parameter Keterangan:

  • -F Fs atau fs --field-pemisah
    Menentukan mengajukan masukan off pemisah, fs adalah string atau ekspresi reguler, seperti -F:.
  • v var = nilai atau var --asign = nilai
    Menetapkan variabel yang ditetapkan pengguna.
  • scripfile -f atau SCRIPTFILE --file
    perintah awk membaca dari file script.
  • -mf nnn dan -mr nnn
    nilai nnn dari keterbatasan, jumlah maksimum blok nnn batas pilihan -mf ditugaskan; opsi membatasi jumlah maksimum -mr record. Kedua fitur versi Bell Labs ekstensi awk di awk standar tidak berlaku.
  • -W Compact atau --compat, -W tradisional atau --traditional
    Berjalan dalam modus kompatibilitas awk. Jadi melongo perilaku dan persis awk standar yang sama, awk semua ekstensi diabaikan.
  • -W Copyleft atau --copyleft, hak cipta -W atau --copyright
    Mencetak informasi hak cipta singkat.
  • Bantuan -W atau help, penggunaan -W atau --usage
    Cetak deskripsi singkat dari semua pilihan awk dan setiap pilihan.
  • -W Lint atau --lint
    peringatan cetak tidak struktur port unix tradisional.
  • -W Lint-lama atau --lint berusia
    Pencetakan tidak dapat ditransplantasikan ke tradisional unix struktur platform yang peringatan.
  • -W POSIX
    Mengaktifkan mode kompatibilitas. Dengan pembatasan berikut, tidak mengenali: / x, tombol fungsi, func, melarikan diri urutan, dan ketika fs adalah ruang, garis baru sebagai pemisah lapangan; operator ** dan ** = tidak dapat menggantikan ^ dan ^ =; fflush tidak valid.
  • -W Re-interval atau --re-inerval
    Memungkinkan ekspresi interval dalam penggunaan biasa, referensi (grep di kelas karakter POSIX), seperti ungkapan braket [[: alpha:]].
  • -W Sumber Program-teks atau program-teks --source
    Gunakan program-teks sebagai kode sumber, dapat dicampur dengan perintah -f.
  • -W Versi atau --version
    Cetak Versi bug pelaporan informasi.

Penggunaan dasar

teks log.txt berbunyi sebagai berikut:

2 this is a test
3 Are you like awk
This's a test
10 There are orange,apple,mongo

Gunakan:

awk '{[pattern] action}' {filenames}   # 行匹配语句 awk '' 只能用单引号

contoh:

# 每行按空格或TAB分割,输出文本中的1、4项
 $ awk '{print $1,$4}' log.txt
 ---------------------------------------------
 2 a
 3 like
 This's
 10 orange,apple,mongo
 # 格式化输出
 $ awk '{printf "%-8s %-10s\n",$1,$4}' log.txt
 ---------------------------------------------
 2        a
 3        like
 This's
 10       orange,apple,mongo
 

Penggunaan II:

awk -F  #-F相当于内置变量FS, 指定分割字符

contoh:

# 使用","分割
 $  awk -F, '{print $1,$2}'   log.txt
 ---------------------------------------------
 2 this is a test
 3 Are you like awk
 This's a test
 10 There are orange apple
 # 或者使用内建变量
 $ awk 'BEGIN{FS=","} {print $1,$2}'     log.txt
 ---------------------------------------------
 2 this is a test
 3 Are you like awk
 This's a test
 10 There are orange apple
 # 使用多个分隔符.先使用空格分割,然后对分割结果再使用","分割
 $ awk -F '[ ,]'  '{print $1,$2,$5}'   log.txt
 ---------------------------------------------
 2 this test
 3 Are awk
 This's a
 10 There apple

Menggunakan tiga:

awk -v  # 设置变量

contoh:

 $ awk -va=1 '{print $1,$1+a}' log.txt
 ---------------------------------------------
 2 3
 3 4
 This's 1
 10 11
 $ awk -va=1 -vb=s '{print $1,$1+a,$1b}' log.txt
 ---------------------------------------------
 2 3 2s
 3 4 3s
 This's 1 This'ss
 10 11 10s

Menggunakan empat:

awk -f {awk脚本} {文件名}

contoh:

 $ awk -f cal.awk log.txt

operator

operator deskripsi
= + = - = * = / =% = ^ = ** = tugas
?: ekspresi kondisional C
|| logis atau
&& logika dan
~ ~! Mencocokkan ekspresi reguler tidak cocok dengan ekspresi reguler
<< = >> =! = == Operator relasional
kosong koneksi
+ - Selain itu, pengurangan
* / & Perkalian, pembagian dan sisanya
+ -! Unary ditambah, dikurangi, dan negasi logis
^ *** eksponensial
++ - Meningkat atau menurun, sebagai awalan atau akhiran
$ referensi bidang
di anggota array

Menyaring kolom pertama baris lebih besar dari 2

$ awk '$1>2' log.txt    #命令
#输出
3 Are you like awk
This's a test
10 There are orange,apple,mongo

Menyaring kolom pertama dari baris 2 equals

$ awk '$1==2 {print $1,$3}' log.txt    #命令
#输出
2 is

Menyaring baris pertama dan kolom kedua lebih besar dari 2 kolom equals 'Apakah' dari

$ awk '$1>2 && $2=="Are" {print $1,$2,$3}' log.txt    #命令
#输出
3 Are you

Built-in variabel

variabel deskripsi
\ $ N bidang N-th dari rekor saat, dipisahkan oleh FS antara bidang
\ $ 0 record input yang lengkap
argc Jumlah parameter baris perintah
ARGIND Posisi pada baris perintah dari file saat ini (mulai menghitung dari 0)
ARGV Array berisi argumen baris perintah
CONVFMT LINGKUNGAN lingkungan Format variabel array asosiatif konversi digital (default adalah% .6g)
errno Akhirnya, deskripsi kesalahan sistem
FIELDWIDTHS Lebar daftar bidang (dipisahkan oleh spasi)
FILENAME nama file saat ini
FNR Dengan NR, tapi relatif ke file saat ini
FS pemisah lapangan (default adalah spasi)
ignorecase Jika benar, kasus-sensitif pertandingan
NF Jumlah bidang dalam catatan saat ini
NR Saat ini jumlah catatan
OFMT format output digital (default adalah% .6g)
OFS pemisah lapangan Output (default adalah spasi)
ORS Catatan output separator (default adalah baris baru)
RLENGTH Panjang pertandingan dengan fungsi string cocok
RS Rekam pemisah (default adalah baris baru)
RSTART Posisi pertama cocok dengan fungsi string cocok
SUBSEP pemisah Array subscript (default adalah / 034)
$ awk 'BEGIN{printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n","FILENAME","ARGC","FNR","FS","NF","NR","OFS","ORS","RS";printf "---------------------------------------------\n"} {printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n",FILENAME,ARGC,FNR,FS,NF,NR,OFS,ORS,RS}'  log.txt
FILENAME ARGC  FNR   FS   NF   NR  OFS  ORS   RS
---------------------------------------------
log.txt    2    1         5    1
log.txt    2    2         5    2
log.txt    2    3         3    3
log.txt    2    4         4    4
$ awk -F\' 'BEGIN{printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n","FILENAME","ARGC","FNR","FS","NF","NR","OFS","ORS","RS";printf "---------------------------------------------\n"} {printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n",FILENAME,ARGC,FNR,FS,NF,NR,OFS,ORS,RS}'  log.txt
FILENAME ARGC  FNR   FS   NF   NR  OFS  ORS   RS
---------------------------------------------
log.txt    2    1    '    1    1
log.txt    2    2    '    1    2
log.txt    2    3    '    2    3
log.txt    2    4    '    1    4
# 输出顺序号 NR, 匹配文本行号
$ awk '{print NR,FNR,$1,$2,$3}' log.txt
---------------------------------------------
1 1 2 this is
2 2 3 Are you
3 3 This's a test
4 4 10 There are
# 指定输出分割符
$  awk '{print $1,$2,$5}' OFS=" $ "  log.txt
---------------------------------------------
2 $ this $ test
3 $ Are $ awk
This's $ a $
10 $ There $

Gunakan pencocokan string biasa

# 输出第二列包含 "th",并打印第二列与第四列
$ awk '$2 ~ /th/ {print $2,$4}' log.txt
---------------------------------------------
this a

~ A skema dimulai.// Apakah modus.

# 输出包含"re" 的行
$ awk '/re/ ' log.txt
---------------------------------------------
3 Are you like awk
10 There are orange,apple,mongo

abaikan

$ awk 'BEGIN{IGNORECASE=1} /this/' log.txt
---------------------------------------------
2 this is a test
This's a test

Mode menegasikan

$ awk '$2 !~ /th/ {print $2,$4}' log.txt
---------------------------------------------
Are like
a
There orange,apple,mongo
$ awk '!/th/ {print $2,$4}' log.txt
---------------------------------------------
Are like
a
There orange,apple,mongo

skrip awk

Tentang naskah awk, kita perlu memperhatikan dua kata kunci BEGIN dan END.

  • BEGIN {ada diletakkan sebelum mengeksekusi laporan}
  • END {Ini adalah pernyataan yang menempatkan semua baris setelah pengolahan akan dieksekusi}
  • {Ini adalah proses yang menempatkan pernyataan yang akan dieksekusi untuk setiap baris}

Asumsikan bahwa dokumen tersebut (tabel prestasi siswa):

$ cat score.txt
Marry   2143 78 84 77
Jack    2321 66 78 45
Tom     2122 48 77 71
Mike    2537 87 97 95
Bob     2415 40 57 62

skrip awk kami sebagai berikut:

$ cat cal.awk
#!/bin/awk -f
#运行前
BEGIN {
    math = 0
    english = 0
    computer = 0
 
    printf "NAME    NO.   MATH  ENGLISH  COMPUTER   TOTAL\n"
    printf "---------------------------------------------\n"
}
#运行中
{
    math+=$3
    english+=$4
    computer+=$5
    printf "%-6s %-6s %4d %8d %8d %8d\n", $1, $2, $3,$4,$5, $3+$4+$5
}
#运行后
END {
    printf "---------------------------------------------\n"
    printf "  TOTAL:%10d %8d %8d \n", math, english, computer
    printf "AVERAGE:%10.2f %8.2f %8.2f\n", math/NR, english/NR, computer/NR
}

Kami melihat pelaksanaan hasil:

$ awk -f cal.awk score.txt
NAME    NO.   MATH  ENGLISH  COMPUTER   TOTAL
---------------------------------------------
Marry  2143     78       84       77      239
Jack   2321     66       78       45      189
Tom    2122     48       77       71      196
Mike   2537     87       97       95      279
Bob    2415     40       57       62      159
---------------------------------------------
  TOTAL:       319      393      350
AVERAGE:     63.80    78.60    70.00

contoh lebih lanjut

AWK adalah program hello world:

BEGIN { print "Hello, world!" }

Ukuran File Perhitungan

$ ls -l *.txt | awk '{sum+=$6} END {print sum}'
--------------------------------------------------
666581

Untuk mengetahui dari file yang lebih besar dari panjang garis 80

awk 'lenght>80' log.txt

tabel perkalian cetak

seq 9 | sed 'H;g' | awk -v RS='' '{for(i=1;i<=NF;i++)printf("%dx%d=%d%s", i, NR, i*NR, i==NR?"\n":"\t")}'

Informasi lebih detail dapat dilihat pengguna resmi AWK: http://www.gnu.org/software/gawk/manual/gawk.html

Linux perintah Daquan Linux perintah Daquan