shell编程—awk命令详解

目录

1、awk命令完整语法和工作原理

2、awk自带变量

3、awk中的模糊匹配和精确匹配

4、awk实例

5、awk命令的引用shell变量

6、awk命令与if语句、for循环、数组组合使用


1、awk命令完整语法和工作原理

awk命令完整语法

awk 'BEGIN{commands}pattern{commands}END{commands}' filename

注意:{}里面有两条commans用;隔开


pattern可以是:
1、表示判断的 $2>3 &&(与)  || (或)
2、表示匹配的 $1 ~ /tian/  第一列中包含tian的
commands里面可以加if语句,表示if成立则执行这条语句:if($2>3) print $2,$3(,表示输出分隔符)

awk命令的工作原理

  1. 执行BEGIN{commands}语句块中的有语句
  2. 从文件或者stdin中读取第一行
  3. 有无模式匹配pattern,如果没有则执行{}中的语句
  4. 若有则检查该整行与pattern是否匹配,若匹配,则执行{}中的语句
  5. 若不匹配则不执行{}中的语句,接着读取下一行
  6. 重复这个过程,直到所有行被读取完毕
  7. 执行END{}语句块中的语句

2、awk自带变量

NR变量是记录行的,每处理一行自己加1

NF记录一行有多少列

FS当前的输入分隔符,默认为空白

OFS当前的输出分隔符,默认是空格

$1 $2 分别表示第1列、第2列

$0 表示正在处理的这一行

3、awk中的模糊匹配和精确匹配

$1 ~ /tian/ 模糊匹配,可以使用通配符
$1 == "tianyang" 精确匹配,必须一模一样

[root@sc-host fuxi]# cat test.txt 
xiaomi1 XIAOMI
huawei xiaomi
xiaomi123
xiaomi
 

#模糊匹配

[root@sc-host fuxi]# awk '$1~/\<^xiaomi.*\>/{print $0}' test.txt
xiaomi1 XIAOMI
xiaomi123
xiaomi

#精确匹配
[root@sc-host fuxi]# awk '$1=="xiaomi"{print $0}' test.txt
xiaomi

4、awk实例

[root@sc-host fuxi]# cat alijiujiu.txt 
tiankai 1
gaoshuo 1
zhangtt 10
zhoujc 1
tianyang 100
 

[root@sc-host fuxi]# awk 'BEGIN{print "阿里舅舅公司股东集资"}{sum += $2;if ($2>1)print $0}END{print "阿里 舅舅公司股东集资总额:"sum}' alijiujiu.txt 
###统计股东投资数综合(第二列),大于1的输出
[root@sc-host fuxi]# awk 'BEGIN{print "阿里舅舅公司股东集资"} $2 > 1{sum += $2;print $0}END{print "阿里舅 舅公司股东集资总额:"sum}' alijiujiu.txt 
###统计股东投资数大于1的股东投资总和
 

5、awk命令的引用shell变量

-v 引入shell变量

[root@sc-host fuxi]# name="hahha"                        #定义name变量

[root@sc-host fuxi]# echo |awk -v abc=$name '{print abc}' #引用shell变量
hahha
 

使用双引号"代替单引号',但是$符号需要转义

awk -F: "\$1 ~/$a/ {print \$1,\$3}" /etc/passwd   #\$1不是表示的第1列,而是表示第1个位置变量

6、awk命令与if语句、for循环、数组组合使用

if语句

单分支:

awk -F: '{if($1 ~ \<...\>)print $0}' /etc/passwd
如果passwd文件中的第1列包含三个或三个以上的字符,输出整行

多分支

awk -F: '{if ($3!=0) print $1;else print $3}' /etc/passwd
如果passwd文件中第3列不等于0输出第1列,等于0输出第3列

for循环

[root@sc-host fuxi]# cat grade.txt 
name chinese math english
cali 80      90   82
tom  90      80   99
lucy 99      78   75
jack 60      89   99
 

[root@sc-host fuxi]# awk 'NR>1{sum=0;for(i=1;i<=NF;i++)sum+=$i;print $1,sum}' grade.txt 
cali 252
tom 269
lucy 252
jack 248
实现每个人各科成绩的累加

数组 array

[root@sc-host fuxi]# awk 'NR>1{pro[$2]=$2;pro[$2] += $3}END{for(i in pro) print pro[i]}' grade.txt 
170
170
177
149
实现数学和语文分数的相加

  • 16
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回答: awk是一种强大的文本处理工具,它可以根据指定的分隔符将文本文件的每一行分割成不同的字段,并对这些字段进行处理。在awk,$1、$2、$3等表示行(记录)的不同字段,$0表示整个行(记录)。默认情况下,awk使用空格作为分隔符,但也可以通过在命令使用“-F 分隔符”的形式来指定分隔符。\[1\] 举例来说,可以使用awk来筛选和处理passwd文件的内容。例如,可以使用以下命令来找到passwd文件第一域匹配root的部分并输出该行: awk 'BEGIN {FS=":"} $1~/root/' passwd 还可以使用awk来找到passwd文件全部域匹配root的部分并输出该行: awk 'BEGIN {FS=":"} $0~/root/' passwd 另外,可以使用awk来找到passwd文件全部域不匹配home的部分并输出该行: awk 'BEGIN {FS=":"} $0!~/home/' passwd 这些例子展示了awk在文本处理的灵活性和强大功能。通过指定不同的条件和操作,可以实现各种文本处理任务。\[3\] #### 引用[.reference_title] - *1* [【linuxShell 编程 awk 命令详解](https://blog.csdn.net/sirria1/article/details/126768903)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [shellawk命令](https://blog.csdn.net/nigar_/article/details/104336992)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值