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 '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
|