我有文件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] ","
。