实战文件: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 表示 第1至n列,例子如上
-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
可以从上述命令执行结果和对应说明中理解各个参数的应用,为了说明FNR和NR的区别,我们用两个文件来做:
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
未完待续。。。。