查找文件中单词的行号

时间:2014-08-16 01:49:24

标签: awk grep find line word

我有一个文件:file.txt,其中包含以下数据。 GNU grep版本:2.5.1,系统管理员拒绝将其升级到更高版本,因为它可能会影响生产

This is a file, my name is Karl, what is this process, karl is karl junior, file is a test file, file's name is file.txt
My name is not Karl, my name is Karl Joey
What is your name?
Do you know your name and what it is?

当我运行以下命令以使用以下命令在此文件中获取单词“is”的行#时,它给出了如下输出:

$ grep -now“是”file.txt

1:is
is
is
is
is
is
2:is
is
3:is
4:is

我可以运行什么命令来获得以下输出:

1:is
1:is
1:is
1:is
1:is
1:is
2:is
2:is
3:is
4:is

is:1,1,1,1,1
is:2,2
is:3
is:4

如果我正在尝试以下命令,我会接近但我想用is替换1并且用1(逗号分隔) grep -now“是”file.txt | tr'\ 012'''| sed“s /([0-9]:)/ \ n \ 1 / g”| grep“。”

1:is is is is is is
2:is is
3:is
4:is

3 个答案:

答案 0 :(得分:1)

如果您可以使用perl,那么此处正在使用他们的last match start (@-)last match end (@+)

perl -lne '
while ($_ =~ /\bis\b/g) {
    print "$.:", substr($_, $-[0], $+[0] - $-[0]);
}' file
1:is
1:is
1:is
1:is
1:is
1:is
2:is
2:is
3:is
4:is

基于OP的请求的新格式:

perl -lne '
    $found =()= /\bis\b/g;
    print substr($_, $-[0], $+[0] - $-[0]), ":", join (",", ($.) x $found);
' file
is:1,1,1,1,1,1
is:2,2
is:3
is:4

将GNU awk用于字边界:

gawk '{
    n = gsub(/\<is\>/,"");
    printf "%s:", "is"; 
    for (i=1; i<=n; i++) printf "%s%s", NR, (i==n?RS:",")
}' file
is:1,1,1,1,1,1
is:2,2
is:3
is:4

使用vanilla awk(礼貌Ed Morton(见评论)):

awk '
{
    n = gsub(/(^|[^[:alpha:]])is([^[:alpha:]]|$)/,"");
    printf "%s:", "is";
    for (i=1; i<=n; i++) printf "%s%s", NR, (i==n?RS:",")
}' file
is:1,1,1,1,1,1
is:2,2
is:3
is:4

答案 1 :(得分:0)

grep -o -n "is" file.txt

似乎可以在我的系统上运行。

答案 2 :(得分:0)

如果您可以升级grep的版本,则应该修复它:

# grep --version
grep (GNU grep) 2.16
Copyright (C) 2014 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Mike Haertel and others, see <http://git.sv.gnu.org/cgit/grep.git/tree/AUTHORS>.
# grep -now is file
1:is
1:is
1:is
1:is
1:is
1:is
2:is
2:is
3:is
4:is

使用grep模仿perl的输出:

# perl -lne '$x = "is"; $c = () = /\b$x\b/g; while ($c--) { print "$.:$x"; }' file
1:is
1:is
1:is
1:is
1:is
1:is
2:is
2:is
3:is
4:is

另:

# perl -lne '$x = "is"; $c = () = /\b$x\b/g; next unless $c--; $t = "${x}:$."; $t .= ",$." while ($c--); print $t' file
is:1,1,1,1,1,1
is:2,1
is:3
is:4