awk命令使用

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

转载于:https://www.cnblogs.com/onefish/p/10181492.html

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值