在同一 awk 命令中搜索字符串并剪切

在同一 awk 命令中搜索字符串并剪切

我有文件abc.txt其中有这样的数据 -

abc pqr testing, xyz=a432j42jjk4, key=124

abc pqr testing, xyz=jkl234j54nn, key=567
abc pqr testing, xyz=2395hdshkw4, key=3232


abc pqr testing, xyz=abc424729hh, key=7676
abc pqr testing, xyz=70700ghgh99, key=12342

我正在使用 awk 搜索文本“xyz”,例如 -

awk -F"xyz=" '{print $2}' abc.txt | awk '{print $1}'

这给了我带有新行的输出 -

a432j42jjk4,

jkl234j54nn,
2395hdshkw4,


abc424729hh,
70700ghgh99,

我正在 awk 中寻找快捷方式或技巧,在其中我可以获得输出,同时从中删除换行符。

答案1

使用 GNUgrep来实现:

$ grep -o -P '(?<=\bxyz=)[^,]+,' abc.txt 

grep打印与给定正则表达式匹配的行。我们-o定义只打印该行的匹配部分。我们-P的正则表达式被解释为 perl 正则表达式,这给了我们更多的选择。

我们的正则表达式说:

  • 找到另外一个不是,( [^,]+) 并以结尾的字符,
  • 这些连续的字符应该跟在 a 之后,xyz= (?<=\bxyz=)这称为正数向后看)。我们\b确保不会 grep 之类的东西booxyz=

答案2

我们可以使用内置的匹配功能来awk进一步简化命令:

$ awk -F ',' '/xyz=/ {split($2,a,"="); print a[2]}' file
a432j42jjk4
jkl234j54nn
2395hdshkw4
abc424729hh
70700ghgh99

这里我们使用awk来匹配包含 的行xyz=,这样我们就不必if在后面使用该语句来去掉空行。

这看起来更具可读性,因为逻辑更多地从左到右流动。

此解决方案不能防止xyz=出现在逗号分隔文件中第二个字段以外的字段中的情况。

答案3

使用标准awk并假设您想要寻找xyz= 具体来说在第二个逗号分隔字段中。

$ awk -F ',' '{ split($2,a,"="); if (a[1] == " xyz") print a[2] }' file
a432j42jjk4
jkl234j54nn
2395hdshkw4
abc424729hh
70700ghgh99

或者,

$ awk -F ',' '{ split($2,a,"=") } a[1] == " xyz" { print a[2] }' file
a432j42jjk4
jkl234j54nn
2395hdshkw4
abc424729hh
70700ghgh99

这会将输入视为由带有逗号分隔字段的行组成。代码的实际主体awk会将第二个逗号分隔字段拆分为 上的子字段=,然后如果第一个字段恰好是字符串xyz(包括逗号之前的初始空格),则打印其中的第二个字段。

空行将被删除,因为a[1]在这些行上无法获得所需的值。

您是否想在每行输出末尾添加额外的逗号,请使用print a[2] ","

相关内容