awk基础语法
awk [options] ‘program’ file1 , file2 ,
//对于上述语法中的program来说,又可以细分成pattern和action
awk [options] ‘Pattern{Action}’ file
普通参数
-F |
指定分隔符 |
-v |
指定变量和默认值 |
$NF |
代表最后一个字段 |
NR |
代表第几行 |
&& |
与 |
|| |
或 |
FS |
输入分隔符,与-F分隔符一样 |
OFS |
输出字段分隔符 |
RS |
输入记录分隔符 |
$0 |
显示整行 |
1…N |
第一个字段到第N个字段 |
实例
tail -1 /etc/passwd | awk -F ":" '{print $6}'
awk '{FS=":"}NR==2{print $1,$2}' 3.txt
awk 'BEGIN{FS=":"}NR==2{print $1,$2}' 1.txt
awk -F ":" 'NR==2{OFS="_";print $1,$2}' 1.txt
awk 'BEGIN{FS=":";OFS="-"}NR==2{print $1,$2,$3}' 1.txt
最高:BEGIN是最高优先级,是在执行PROGRAM之前执行的,不需要提供数据源,因为不涉及任何数据,也不依赖PROGRAM代码块;
默认:PROGRAM是对数据流干什么,是必选代码块,也是默认代码块。所以执行的时候必须要加上数据源; 默认优先级(不加优先级就是默认)
最低:END是处理完数据流后,如果需要执行END代码块,就必须要PROGAM的支持,单个无法执行
awk命令之控制流写法
if |
判断控制语句 |
for |
循环语句 |
while |
循环语句 |
do…while |
循环 |
循环控制语句 |
break #只有break可以用 |
awk '{if($1>5)print $1*$2;else print $1/$2}' 2.txt
awk '{a=0;for(i=1;i<11;i++){a+=$i}print a}' 2.txt
awk小技巧
awk 'END{print NR}' /etc/passwd
awk 'END{print $0}' /etc/passwd
awk -F ":" 'END{print NF}' /etc/passwd
cat example.txt | awk 'NR%2==1'
echo " false" |awk -F' ' '{print $NF}'
docker images | grep 'mysql' | awk '{printf"%s:%s\n",$1,$2}'
ps -ef | grep java | grep -v 'color' awk '{for (i=8;i<=NF;i++)printf("%s ", $i);print ""}'
df | grep -v tmpfs | awk 'NR!=1 {disk[$1]=$4} \
END {for(i in disk) {printf "%-20s %-10s\n",i,disk[i]/1024"M"}
}'