商城首页欢迎来到中国正版软件门户

您的位置: 首页 > 文章列表 > 系统应用 > 使用awk按模式筛选文本或字符串的方法

使用awk按模式筛选文本或字符串的方法

  发布于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

使用awk按模式筛选文本或字符串的方法

打印出单价大于 $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按模式筛选文本或字符串的方法

使用 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 和变量来筛选和输出项目

结论

以上就是在 awk 中通过模式匹配来筛选文本的几种简单方法。你可以根据需要给文件中的特定行打上标记,整个流程很灵活,也能节省不少手动操作的时间。

本文转载于:https://www.jb51.net/os/RedHat/532448.html 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

热门关注