1.使用格式
awk '条件1{动作1} 条件2{动作2}'
2.例子演示
#统计单词个数
awk -F ' ' '{for(i = 1;i <= NF;i = i +1){print $i}}' work.txt | sort | uniq -c | sort -nr | awk -F ' ' '{printf("%s %s\n",$2,$1)}'
#搜索并统计单词"law"的个数
awk -F ':' '/law/ {count++} END{print "the count is ",count}' work.txt
#转置文件,将列转换为行输出
awk '{for(i=1;i<=NF;i++) {a[NR,i]=$i}} END{for(i=1;i<=NF;i++) {str=a[1,i]; for(j=2;j<=NR;j++){str=str" "a[j,i]}print str}}' word.txt
3.工作原理
awk 会把每行进行一个拆分,用相应的命令对拆分出来的“段”进行处理。
(1)行工作模式,读入文件的每一行,会把一行的内容,存到$0里
(2)使用内置的变量FS(段的分隔符,默认用的是空白字符),分割这一行,把分割出来的每个段存到相应的变量$(1-100)
(3)输出的时候按照内置变量OFS(out FS),输出
(4)读入下一行继续操作
4.内置变量
NF:当前行的字段个数
NR:当前行的行号
FS:分隔符,默认是空格
$0:当前行内容
$1~$n:当前行的对应第n段的内容
5.awk和print使用
注意点:与print命令使用时,要用到双引号""
5.1简单例子演示(测试文件test)
#打印第一行NR==1
awk 'NR==1 {print $0}' test
#打印最后一行
awk 'END {print $0}' test
#打印每行的最后一个字段: $NF
awk -F: '{print $NF}' test
#打印每行的第一个字段,倒数第二个字段,并在其后打印你好
awk -F: '{print $1,$(NF-1),"你好"}' test
#打印行号
awk '{print NR,$0}' test
6.awk和printf使用
注意点:
1 与printf命令使用时,要用到双引号""
2 必须加上\n,才能进行换行操作
6.1格式化符
%d:十进制有符号整数
%f:浮点数
%s:字符串
%c:显示字符的ASCII码
%u:十进制无符号整数
%%:显示其自身
6.2修饰符
"-":左对齐
"+":显示数值符号
"N":显示
6.3简单例子演示
#整数,保留两位小数,
awk -F: '{printf "%d\t%.2f\t%s\n",$1,$2,$3}' test
7.awk其他使用
7.1.正则表达式 ## (条件中使用正则表达式,格式是/ /)
可以直接使用:. * + ? ^ $ [] < > ()
不可以使用:{ },这个和命令中大括号重复
7.2.逻辑运算符
&& || !
与 或 非
7.3.关系预算符
< == != >= <= ~(匹配) !~(不匹配)
7.4.算数运算符
- / %
7.5.BEGIN END
BEGIN{动作1;动作2;...} 在处理文件之前,要执行的动作,只执行一次,常用于给文件条件标题,定义变量,定义文件的分隔符
END{动作1;动作2;...} 在处理完文件之后,要执行的动作,只执行一次,常用于汇总的操作getline 可以从管道和标准输入读取输入,然后传到变量。变量不需要加上$符号
7.6.简单例子
awk -F: '!/^root/ {print $1,$NF}' /etc/passwd|head -3
awk -F: '{printf "%-5s %3d %.2f\n",$1,$2+$3,($2+$3+$4)/2}' test
awk 'BEGIN {"date" | getline a} {print $0} END {print a}' test
awk 'BEGIN {FS=":"} $3<10 {print $1,$3}' /etc/passwd
8.awk里的流控制和循环
8.1.条件判断
语法:'(表达式 ? 值1 : 值2)' 表达式成立,输出值1,否则输出值2
if语法:'if (条件表达式1) {动作1;动作2;...} else if(条件表达式2) {} else {}'
8.2.循环控制
while语法:’var=初值;while (表达式){动作1;...;更新变量动作}'
for语法:for(表达式) {动作1;...}