如何使用 Awk 通过模式特定操作过滤文本或字符串
在 Awk 命令系列的第三部分中,我们将研究如何根据用户可以定义的特定模式过滤文本或字符串。
有时,在过滤文本时,您希望根据给定条件或使用可匹配的特定模式来指示输入文件中的某些行或字符串行。使用Awk执行此操作非常简单,这是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-9]\.[0-9][0-9] */
获取食品价格大于2 美元的行,并且 - 第二个:
/*\$[0-1]\.[0-9][0-9] */
寻找食品价格低于2 美元的商品行。
事情是这样的,文件中有四个字段,当模式一遇到食品价格大于2 美元的行时,它会打印所有四个字段,并(*)
在行末打印一个符号作为标志。
第二种模式只是打印输入文件food_prices.list中食品价格低于2 美元的其他行。
这样,您可以使用特定于模式的操作来过滤掉价格高于2 美元的食品,尽管输出存在问题,但带有符号的行(*)
没有像其余行那样格式化,导致输出不够清晰。
我们在awk 系列的第 2 部分中看到了同样的问题,但我们可以通过两种方式解决它:
1.使用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
2.使用$0字段。Awk使用变量0来存储整个输入行。这对于解决上述问题很方便,并且简单快捷,如下所示:
$ awk '/ *$[2-9]\.[0-9][0-9] */ { print $0 "*" ; } / *$[0-1]\.[0-9][0-9] */ { print ; }' food_prices.list
结论
现在就是这样了,这些是使用特定模式操作过滤文本的简单方法,可以帮助使用Awk命令标记文件中的文本行或字符串。
希望您发现这篇文章有用,并记得阅读本系列的下一部分,该部分将重点介绍如何使用 awk 工具使用比较运算符。