perintah awk linux
perintah awk linux
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