我有一个如下所示的文件。我想返回info2右边的值。其次,我想以相同的方式返回 info5 的值。
文件:
info1 218, info2 111, info3 415, info5 done,
答案1
和awk
:
$ awk 'BEGIN { RS="," } $1 ~ /info[25]$/ { print $2 }' input
111
done
我们将输入记录分隔符 ( RS
) 设置为逗号,然后对于第一个字段包含info
后跟 2 或 5(没有其他内容)的每个记录,打印第二个字段。
答案2
略有改善乔罗巴的回答:
sed -n 's/.*info2 \([^,]*\).*/\1/p' file
-n
意思是“除非特别命令,否则不要打印任何内容”。这(某种程度上)相当于 choroba 使用 来!d
删除(忽略)不匹配的行info2
。- 该命令的内容与 choroba 的非常相似,不同之处在于它捕获除逗号(不仅仅是数字)之外的任何字符的序列,因此它可以
done
从 中提取info5 done,
。 - 该命令以
p
(print) 结尾,因为否则,使用 时-n
,不会打印任何内容。
这样做的优点是不需要指定标签两次。 (如果一行包含 、 等,它不会产生不需要的结果)infoN
info20
info21
答案3
两步解决方案:
tr ',' '\n' <file | sed -n 's/^ *info[25] *//p'
将tr
示例文本转换为
info1 218
info2 111
info3 415
info5 done
并且sed
脚本删除info2
和info5
字符串(以及任何周围的空白),留下所需的文本片段。其他行将被丢弃。
结果:
111
done
最好用 来完成awk
,如DopeGhoti 的解决方案。
awk
基于我的方法的变体tr
:
tr ',' '\n' <file | awk '/info[25]/ { print $2 }'
答案4
您可以使用 sed:
sed '/info2 [0-9]/!d;s/.*info2 \([0-9]*\).*/\1/' file
/info2/
是一个“地址”,任何包含该地址的行都info2
被认为与该地址匹配。!d
表示“删除地址之外的行”,因此只有包含的行info2
才会被下一个命令处理。- 替换使用捕获组来记住 后面的数字
info2
,并且整行( 之前的所有内容info2
、info2
本身、数字以及数字后面的任何内容)都被数字替换。
如果需要在 后面捕获“done” info5
,则不能使用[0-9]*
,但可以将其替换为[^,]*
,即非逗号。