想使用grep命令在字符串中显示匹配的位置

时间:2014-06-26 20:30:16

标签: regex bash

请帮我解决这个问题

示例字符串:

error on port 1:2:4

帮助我使用grep命令,该命令会在该字符串中显示1:2:4的位置,将空格视为分隔符。

预期结果:

4:error on port 1:2:4

我试过grep -b" 1:2:4" filename ...但它返回

0:error on port 1:2:4

4 个答案:

答案 0 :(得分:2)

awk应该有效:

line='error on port 1:2:4'
awk -v line="$line" -v s='1:2:4' '$1==s{print NR, line}' RS=' ' OFS=':' <<< "$line"
4:error on port 1:2:4

答案 1 :(得分:1)

您可以使用awk打印存储相应值的列号

$ echo 'error on port 1:2:4' | awk '{for (i=1;i<=NF;i++){if ($i=="1:2:4") print i}}'
4

要获得所需的结果,

$ echo 'error on port 1:2:4' | awk '{for (i=1;i<=NF;i++){if ($i=="1:2:4") print i":",$0}}'
4: error on port 1:2:4

答案 2 :(得分:1)

编辑:

我完全误解了这个问题而且它被接受了,我的道歉。

正确答案如下:

awk '{ for(i=1;i<=NF;i++){ if($i ~/1:2:4/){print i": "$0} } }' <<< "error on port 1:2:4"
4: error on port 1:2:4

正如评论中所建议的那样:

awk '{ for(i=1;i<=NF;i++){ if($i ~/1:2:4/){print i": "$0} } }' <<< "there's an error on port 1:2:4"
6: there's an error on port 1:2:4 

答案 3 :(得分:0)

检查grep的版本。旧版本有一个错误(见下文)

如果您使用的是正确的版本,请尝试使用-o选项。这对我来说在v2.6.3。

$ grep -b -o '1:2:4' file 
14:1:2:4

参考
Grep --byte-offset not returning the offset (Grep version 2.5.1)