awk 应用

 

实战文件:test.log  内容

 

1840 148990    0000 273839
1841 87999      0001 190432
1842 89306      0001 190433
1843 90431      0002 179591
1844 115357    0003 244693
1845 69873      0004 163991
1846 163991    0002 179541
1847 72279      0005 130333
1848 194204    0006 215442
1849 163973    0007 229824

 

 

 

基本语法:    

gawk [ POSIX or GNU style options ] -f program-file [ -- ] file ...

gawk [ POSIX or GNU style options ] [ -- ] program-text file ...

POSIX options “-” 为开头,后面加参数  “-f”

        

awk -F" "  '{print $4}' test.log |head -2
273839
190432

 

GNU style options : “--”为开头,后面加参数 ”--field-separator”

awk --field-separator=" "  '{print $4}' test.log |head -2
273839
190432
229824

 

awk --field-separator " "  '{print $4}' test.log |head -2
273839
190432

 

基本参数:

-F fs/-- field-separator=fs/--field-separator fs

         fs为分隔符分割file$0表示全部,$1..$n 表示 1n列,例子如上

-v val=val2/--assign val=val2

         val2赋值给val,例如

awk -v abc=xx '{print abc}' test.log |head -2
xx
xx

 

可以和shell结合使用,如

 

xx=22

 

 

awk -v abc=$xx '{print abc}' test.log |head -2
22
22

 

-f program-file/--file program-file/--file=program-file

         读取一个awk程序来执行,如:f.awk 内容为:

         

{print $1}

 

        

awk -F" " -f a.awk test.log |head -2
1840
1841

 

常用实战(默认分割符为控制或者制表符,故-F未写出):

 

1

awk '/0001/' test.log
1841 87999      0001 190432
1842 89306      0001 190433

 

显示出文件中包含 “0001” 的行

2

awk '/0003/,/1846/' test.log
1844 115357    0003 244693
1845 69873      0004 163991
1846 147958    0002 179541

 

显示出从包含”0003”的行到包含”1846”的行,如果包含”0003”的行不存在则输出为空,如果包含”1846”的行不存在则输出为从 包含“0003”的行开始到文件结尾

3

awk  '$2 == 163991' test.log
1846 163991    0002 179541

 

匹配出分割后第二列为”163991”的行

4

awk  '$1<=1843' test.log
1840 148990    0000 273839
1841 87999      0001 190432
1842 89306      0001 190433
1843 90431      0002 179591

 

匹配出分割后第一列小于或等于”1843”的行

5

awk  '$2/$1<40' test.log
1845 69873      0004 163991
1847 72279      0005 130333
匹配出分割后第二列和第一列运算后的行

 

6

awk  '$2>100000 && $1<1848' test.log
1840 148990    0000 273839
1844 115357    0003 244693
1846 163991    0002 179541

 

匹配出分割后逻辑运算之后的行

7

awk '$1>1844{print NR"分割符"NF"分割符"$1"分割符"$NF"分割符"FILENAME"分割符"FNR"分割符""\""FS"\"""分割符""\""OFS"\"""分割符""\""ORS"\"""分割符"ARGC"分割符"ARGV[2]}' test.log a=b
6分割符4分割符1845分割符163991分割符test.log分割符6分割符" "分割符" "分割符"
"分割符3分割符a=b
7分割符4分割符1846分割符179541分割符test.log分割符7分割符" "分割符" "分割符"
"分割符3分割符a=b
8分割符4分割符1847分割符130333分割符test.log分割符8分割符" "分割符" "分割符"
"分割符3分割符a=b
9分割符4分割符1848分割符215442分割符test.log分割符9分割符" "分割符" "分割符"
"分割符3分割符a=b
10分割符4分割符1849分割符229824分割符test.log分割符10分割符" "分割符" "分割符"
"分割符3分割符a=b

 

NR:到当前位置的记录数

NF:记录里面的字段(列)个数

FILENAME:分割的文件名称

$1:记录里面第一字段()

FNR:当前文件中的记录编号

FS:当前文件的分割符 –F 参数的内容

OFS:输出文件的分割符

ORS:输出记录的分割符,当前为换行符

ARGC:命令的参数个数 参数个数为3

ARGV:命令的参数值数组,下标从0开始 下标为2的参数是a=b

可以从上述命令执行结果和对应说明中理解各个参数的应用,为了说明FNRNR的区别,我们用两个文件来做:

 

tail -3  test.log >test2.log

 

 

cat test2.log
1847 72279      0005 130333
1848 194204    0006 215442
1849 163973    0007 229824

 

 

awk '{print FNR,NR,$0}' test.log  test2.log
1 1 1840 148990      0000 273839
2 2 1841 87999         0001 190432
3 3 1842 89306         0001 190433
4 4 1843 90431         0002 179591
5 5 1844 115357      0003 244693
6 6 1845 69873         0004 163991
7 7 1846 163991      0002 179541
8 8 1847 72279         0005 130333
9 9 1848 194204      0006 215442
10 10 1849 163973  0007 229824
1 11 1847 72279      0005 130333
2 12 1848 194204    0006 215442
3 13 1849 163973    0007 229824

 

 未完待续。。。。

 

 

 

你可能感兴趣的:(linux,shell,grep,awk,gawk)