如何 grep 查找 = 符号后的值

如何 grep 查找 = 符号后的值

如何指定 grep 来查找所有可能的值

即,使用如下文件(9701可以是任何值):

9701=1?? 
9701=10.Pp 
9701=1a 8a 
9701=3.a_tt 
9701=1/a -00
9701=Bg1998pps

我可以尝试

egrep -Eo '9701=[A-Z]+[a-z]+[0-9]{1,50}' test.log

这只给我大写/小写和数字值。如何在 grep 请求中包含带有特殊字符的值?即,带有空格、点、连字符、下划线等。

答案1

cut -d '=' -f 2-  data.in

这会将每一行视为多个=- 分隔的字段,并返回第一个字段之后的所有内容

输出:

1??
10.Pp
1a 8a
3.a_tt
1/a -00
Bg1998pps

如果您需要确保只返回与行的初始部分相关的内容(9701在您的情况下):

grep '^9701=' data.in | cut -d '=' -f 2-

或者,整个事情awk

awk -F '=' '$1 == "9701" { sub(/^[^=]+=/,""); print }' data.in

这会对第一个分隔字段进行字符串比较,=以查找我们感兴趣的记录,然后删除第一个字段和=分隔符并输出剩下的内容。

答案2

要包含您中的所有其他字符,grep您可以使用以下命令:

grep -Eo '9701=.{1,50}' test.log

点代表任何字符。

但这不会切断每行的“9701=”部分。要实现这一点,您可以使用cut

cut -d "=" -f 2- test.log

尽管如果该值=也包含在内,这会遇到麻烦。

sed将为您解决此问题,并且最终是解决您问题的更好解决方案:

sed -r 's/^9701=(.*)$/\1/' test.log

或者

sed 's/^9701=\(.*\)$/\1/' test.log

甚至

sed 's/^9701=//' test.log

答案3

pcregrep

pcregrep -o1 '9701=(.*)'

9701=将打印一行中最左侧出现的右侧的内容(对于包含 9701= 的那些行)。

使用使用足够新的 PCRE 构建的 GNU grep

grep -Po '9701=\K.*'

尽管这不会报告类似输入的空行9701=(即后面9701=是空字符串的位置)。

标准情况下,这将是一份工作sed

sed -n 's/9701=/\
/;s/.*\n//p'

答案4

grepPerl-regex模式下lookbehind

grep -oP '=\K.+'

相关内容