如何指定 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
grep
在Perl-regex
模式下lookbehind
:
grep -oP '=\K.+'