使用awk命令获取文本的某一行,某一列
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| 打印文件的第一列 awk '{print $1}' filename
打印文件的前两列 awk '{print $1,$2}' filename
打印完第一列,然后打印第二列 awk '{print $1 $2}' filename
打印文本文件的总行数 awk 'END{print NR}' filename
打印文本第一行 awk 'NR==1{print}' filename
打印文本第二行第一列 sed -n "2, 1p" filename | awk 'print $1'
|
awk分隔符
1 2 3 4 5 6 7 8 9 10
| $ cat test a#b#c#d
$ awk -F# '{print $1,$2}' test a b
$ awk -v FS'#' '{print $1,$2}' test a b awk内置变量FS可以用于指定输入分隔符,但是在使用变量时,需要使用-v选项,用于指定对应的变量,比如 -v FS=’#
|
输出分隔符
awk输出每一列的时候,会使用空格隔开每一列,其实,这个空格,就是awk的默认的输出分隔符
可以使用awk的内置变量OFS来设定awk的输出分隔符,当然,使用变量的时候要配合使用-v选项
1 2 3 4 5 6 7 8 9 10 11 12
| awk -v FS="#" -v OFS='----' '{print $1,$2}' test a----b 默认输出分隔符为空格 awk '{print $1,$2}' test a b
awk '{print $1$2}' test ab
awk '{print $1 $2}' test ab
|
NF的意思
1 2 3
| NF 是一个预定义的变量,其值为当前记录中的字段数。 awk 每次读取记录时都会自动更新 NF 的值。 无论有多少个字段,记录中的最后一个字段都可以用 $NF 表示
|
查找
1 2 3 4 5 6 7 8 9
| # cat m a 91 b 42 c 33 d 14 e 21
# awk '/a/ {print $0}' m a 91
|
打印某列以后的所有列
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| # cat m a 91 sa fd b 42 sa fd c 33 sa fd d 14 sa fd e 21 sa fd
# awk '{ $1=""; print $0 }' m 91 sa fd 42 sa fd 33 sa fd 14 sa fd 21 sa fd 注:第一列会全部替换为空格
以此类推,如果我要打印某列以后的所有列的,可以使用循环把,把前N列都赋值为空 # awk '{ for(i=1; i<=3; i++){ $i="" }; print $0 }' m fd fd fd fd fd
|
awk输入输出分隔符
1 2 3 4 5 6 7 8 9 10 11
| awk默认从STDIN接受数据,打印文本到STDOUT。
awk的默认输入和输出分隔符:
FS : 输入字段分隔符,默认空格。
RS : 输入行分隔符,默认\n。
OFS : 输出字段分隔符,默认空格。
ORS : 输出行分隔符,默认\n。
|
区分shell函数的参数
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| # echo a,s,d,f |awk 'BEGIN{FS=","; OFS=""; ORS=""}{for(x=1;x<=NF;x++){print $x"\n"}}'
a s d f
# for i in `echo a,s,d,f |awk 'BEGIN{FS=","; OFS=""; ORS=""}{for(x=1;x<=NF;x++){print $x"\n"}}'`;do echo $i;done
a s d f
|
去掉重复行
1 2 3 4 5
| awk '!a[$0]++' file
或者
sort file | uniq
|
解析
提取文本最后一行
1 2 3
| awk 'END {print}'
awk '{b=a"\n"$0;a=$0}END{print b}'
|
提取两个括号之间的内容
1
| awk 'BEGIN{FS="[()]"}{print $2}'
|
awk的输出格式控制:print 和printf
1 2 3
| printf更加自由化,一切输出格式都需要自己定义。
print是定义好的printf,通过内部变量能改变已经定义好的格式。
|
printf的用法:
格式:printf “格式化”,变量1,变量2
格式化内容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| 1.数据格式
十进制整数:%d
科学计数法显示数字:%e
浮点数:%f
字符串:%s
ASCII码:%c
2.换行,空格等
换行:\n
空格:\t
3.对齐
左对齐:“-”,默认右对齐。
|
计算2个数值的百分比
1 2 3 4 5 6
| a=20 b=100 #计算百分比 echo `awk 'BEGIN{printf "%.1f%%\n",('$a'/'$b')*100}'`
20.0%
|
在shell中统计某字符串的个数
通过使用grep查找命令
1
| $ grep -o '字符串' file | wc -l
|
通过使用awk命令进行统计
1
| $ awk -v RS="@#$j" '{print gsub(/字符串/,"&")}' file
|
使用awk命令的另一种方式
1
| $ awk '{s+=gsub(/字符串/,"&")}END{print s}' file
|