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

1
2
# 每行按空格或TAB分割,输出文本中的1、4项
$ awk '{print $1,$4}' log.txt

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

1
2
# 使用","分割
$ awk -F, '{print $1,$2}' log.txt

awk -v # 设置变量

1
$ awk -va=1 '{print $1,$1+a}' log.txt

awk -f {awk脚本} {文件名} # 赋值一个用户定义变量

1
$ awk -f cal.awk log.txt

使用awk取某一行数据中的倒数第N列:**$(NF-(n-1))**

比如取/etc/passwd文件中的第2列、倒数第1、倒数第2、倒数第4列(以冒号为分隔符)。($NF表示倒数第一列,$(NF-1)表示倒数第二列)

1
awk -F":" '{print $2,$(NF),$(NF-1),$(NF-3)}' /etc/passwd

linux实现将文本文件每一行中相同第一列对应的其他列进行拼接

1
sort b.txt|uniq|awk '{a[$1]=(a[$1]" "$2);} END{for(i in a) print i ":"a[i]}'

使用awk命令获取文本的某一行,某一列的技巧:

1
2
3
4
5
6
1)打印文件的第一列(域) : awk '{print $1}' filename
2)打印文件的前两列(域) : awk '{print $1,$2}' filename
3)打印完第一列,然后打印第二列 : awk '{print $1 $2}' filename
4)打印文本文件的总行数 : awk 'END{print NR}' filename
5)打印文本第一行 :awk 'NR==1{print}' filename
6)打印文本第二行第一列 :sed -n "2, 1p" filename | awk 'print $1'

NR==n 表示打印第n行

NR!=n 表示不打印第n行

AWK的内置变量(NF、NR、FNR、FS、OFS、RS、ORS)

1
2
3
4
5
6
7
NF   字段个数,(当前行有多少列)
NR 记录数(行号),从1开始,新的文件延续上面的计数,新文件不从1开始
FNR 读取文件的记录数(行号),从1开始,新的文件重新从1开始计数
FS 输入字段分隔符,默认是空格
OFS 输出字段分隔符 默认也是空格
RS 输入行分隔符,默认为换行符
ORS 输出行分隔符,默认为换行符

**AWK对文件的"某一列进行去重"的做法 **

1
2
3
4
(命令: awk '{a[$n]=$0}END{for(i in a)print a[i]}' filename)

对test.txt文件的第三列进行去重
[root@bobo tmp]# awk '{a[$3]=$0}END{for(i in a)print a[i]}' test.txt

AWK 将列转为行的做法

1
2
3
4
将a1.txt文件中的列转为行,并用逗号隔开
awk '{printf "%s,",$1}' a1.txt
上面列转为行后,去掉最后一个逗号
awk '{printf "%s,",$1}' a1.txt|sed 's/.$//'

跳过文件里面的空行

1
awk '{if(!NF ){next}}1'

跳过最后一行

1
awk 'NR > 1 { print prev } { prev = $0 }' file.txt

跳过第一行

1
awk 'NR!=1 { print }' file.txt

某一列作为后续指令中的参数

xargs -n指定参数数量

1
xxxxxx | awk '{if (NR>1) print $1" "$3}' | xargs -n2 sh -c 'echo $0 $1'

或者可以保存为变量再使用

1
2
3
4
out=$(xxxxxx | awk '{if (NR>1) print $1" "$3}')
arg1=$(echo $out | cut -d' ' -f1)
arg2=$(echo $out | cut -d' ' -f2)
echo $arg1 $arg2