欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

awk命令使用

程序员文章站 2022-04-30 15:19:06
...

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;...}