使用 grep

使用 grep

考虑以下几行

842567831752rajfkglxfgk  kerigjeiofjgoe jergjerio4523789573489

genfjkgnerijio 234578934897 jgioefjgio  shfhuwehjdfu7890345289103

在linux中如何获得上面几行中789之后的四位数字

答案1

使用 grep

grep -Po '(?<=789).{4}'

解释

  • grep -P: 在 Perl 模式下使用 grep
  • -o: 只返回匹配的部分
  • (?<=789): 向后看。这应该出现在“匹配”部分之前。
  • .{4}:匹配四个字符(在lookbehind之后)。这就是将被返回的内容。

或者使用 sed

sed -r 's/.*789(.{4}).*/\1/'

789这假设队列中只有一个。

解释

  • sed -r:在扩展正则表达式模式下使用 sed 以获得更好的可读性。
  • s/foo/bar/: 用foo。。。来代替bar
  • .*789(.{4}).*:匹配行的开头.*,,789然后四个字符(.{4}),同时捕获它们(),然后是该行的其余部分.*。这与整条线完全匹配。
  • \1:用上面第一个匹配的模式替换整行。

或者使用 awk

awk '{if (match($0,/789(.{4})/,m)) print m[1]}'

789这假设队列中只有一个。在 awk 中可能有六种方法可以做到这一点。

解释

  • match($0,/789(.{4})/,m):在整行中查找$0正则表达式789(.{4}),并捕获后面的四个字符789
  • print m[1]:打印第一个捕获组。

只是数字

如果您只想获取数字,那么您可以使用如下所示的内容:

grep -Po '(?<=789).*' | sed -r 's/^[^0-9]*([0-9])[^0-9]*([0-9])[^0-9]*([0-9])[^0-9]*([0-9]).*/\1\2\3\4/'

请注意,该策略假设有后四位数字789

解释

  • grep -Po '(?<=789).*':与上面类似,但是输出全部后的字符789
  • | sed -r 's/foo/bar/':使用扩展正则表达式模式将其通过管道传输到 sed 并替换foo为 `bar.
  • ^[^0-9]*([0-9])[^0-9]*([0-9])[^0-9]*([0-9])[^0-9]*([0-9]).*:匹配行的开头^,所有非数字字符[^0-9]*,然后捕获数字([0-9])。再重复此操作三次,然后匹配该行的其余部分.*
  • \1\2\3\4:用捕获组替换整行,即接下来的四位数字。

(或者,您可以使用 perl 的非贪婪正则表达式来简化 sed 表达式。perl -pe 's/.*?([0-9]).*?([0-9]).*?([0-9]).*?([0-9]).*/\1\2\3\4/'

答案2

$ echo "842567831752rajfkglxfgk  kerigjeiofjgoe jergjerio4523789573489" | grep -oP '789\K....'
5734
$ echo "genfjkgnerijio 234578934897 jgioefjgio  shfhuwehjdfu7890345289103" | grep -oP '789\K....'
3489
0345

答案3

AWK找到所有 4 位数字之后的项目的解决方案789

awk -F'789' '{ for(i=2;i<=NF;i++) printf "%s%s",(i==2?"":" "),substr($i,1,4); print ""}' file
  • -F'789'-789视为字段分隔符

输出(所有找到的项目每行):

5734
3489 0345

----------

或者简单地将每个项目打印在单独的行上:

awk -F'789' '{ for(i=2;i<=NF;i++) print substr($i,1,4) }' file

输出:

5734
3489
0345

相关内容