发布于2026-06-06 阅读(0)
扫一扫,手机访问
在处理文本时,有时我们需要根据某个条件或模式,把文件里特定几行标记出来——比如给满足条件的行打个星号。这个活儿用 awk 做起来相当顺手,也是它很实用的功能之一。
举个例子,假设你有一个购物清单文件 food_prices.list,里面列出了想买的食物和单价,内容长这样:
$ cat food_prices.list
No Item_Name Quantity Price
1 Mangoes 10 $2.45
2 Apples 20 $1.50
3 Bananas 5 $0.90
4 Pineapples 10 $3.46
5 Oranges 10 $0.78
6 Tomatoes 5 $0.55
7 Onions 5 $0.45
现在,你想把那些单价超过2美元的食物用星号 (*) 标出来。用下面这条命令就能搞定:
$ awk '/ */\$[2-9]\.[0-9][0-9] */ { print $1, $2, $3, $4, "*" ; } / */\$[0-1]\.[0-9][0-9] */ { print ; }' food_prices.list

打印出单价大于 $2 的项目
看看输出,芒果和菠萝那一行末尾多了个星号。没错,它们的单价确实都超过了2美元。
这里用了两个模式:
/ */\$[2-9]\.[0-9][0-9] */ 匹配单价大于2美元的行。/ */\$[0-1]\.[0-9][0-9] */ 匹配单价小于2美元的行。具体来说,文件有四个字段。当模式一命中时,awk 会输出全部四个字段并在末尾加上星号。模式二则把其他行原样输出。
这样就完成了价格筛选。不过输出有个小毛病——带星号的行没有和其他行对齐,看着有点乱。我们在系列文章的第二部分也遇到过类似问题,有两种办法可以解决:
方法一:用 printf 做格式化输出——虽然有点冗长无聊:
$ awk '/ */\$[2-9]\.[0-9][0-9] */ { printf "%-10s %-10s %-10s %-10s/n", $1, $2, $3, $4 "*" ; } / */\$[0-1]\.[0-9][0-9] */ { printf "%-10s %-10s %-10s %-10s/n", $1, $2, $3, $4 ; }' food_prices.list

使用 Awk 和 Printf 来筛选和输出项目
方法二:利用 $0 变量。awk 用 $0 存储整行输入,用在这儿非常省事——简单、快速:
$ awk '/ */\$[2-9]\.[0-9][0-9] */ { print $0 "*" ; } / */\$[0-1]\.[0-9][0-9] */ { print ; }' food_prices.list

使用 Awk 和变量来筛选和输出项目
结论
以上就是在 awk 中通过模式匹配来筛选文本的几种简单方法。你可以根据需要给文件中的特定行打上标记,整个流程很灵活,也能节省不少手动操作的时间。
上一篇:CentOS下如何配置端口转发?
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
4
5
6
7
8
9