每行提取第一个实例(也许是grep?)

时间:2016-08-08 15:04:58

标签: linux ubuntu awk sed grep

我想在linux中每行提取一个字符串的第一个实例。我目前正在尝试grep,但它会产生每行的所有实例。下面我想要" tn =" ...之后的字符串(数字和字母),但每行只需要第一组。实际字符可以是数字或字母的任意组合。他们之后还有一个空间。在tn =

之前还有一个空格

给出以下文件:

hello my name is dog tn=12g3 fun 23k3 hello tn=1d3i9 cheese 234kd dks2 tn=6k4k ksk

1263 chairs are good tn=k38493kd cars run vroom it95958 tn=k22djd fair gold tn=293838 tounge

期望的输出:

12g3

k38493

3 个答案:

答案 0 :(得分:2)

如果你有GNU grep,这是你可以做到的一种方法,它(大多数)支持与-P的Perl兼容正则表达式。此外,非标准开关-o仅用于打印与模式匹配的部分,而不是整行:

grep -Po '^.*?tn=\K\S+' file

模式匹配行^的开头,后跟任何字符.*?,其中?使匹配非贪婪。在tn=的第一场比赛后,\K"杀死"上一部分,因此您只留下您感兴趣的位:一个或多个非空格字符\S+

Ed's answer一样,您可能希望在tn之前添加空格,以避免意外匹配footn=...之类的内容。您可能还希望使用\w之类的内容来匹配" word"字符(相当于[[:alnum:]_])。

答案 1 :(得分:0)

只需在tn= - 分隔符中拆分输入,然后选择第二个。然后,再次拆分以获得第一个空间:

$ awk -F"tn=" '{split($2,a, " "); print a[1]}' file
12g3
k38493kd

答案 2 :(得分:0)

$ awk 'match($0,/ tn=[[:alnum:]]+/) {print substr($0,RSTART+4,RLENGTH-4)}' file
12g3
k38493kd