用这个:

grep -A1 -B1 "test_pattern" file

将在文件中匹配的模式前后产生一行。是否有一种方法不显示行,而是显示指定数量的字符?

我的文件中的行相当大,所以我对打印整行不感兴趣,而只是在上下文中观察匹配。有什么建议吗?


当前回答

我个人做的事情类似于张贴的答案。但由于点键,像任何键盘键,可以点击或按住..我通常不需要很多上下文(如果我需要更多,我可能会像grep -C一样做行,但经常像你一样,我不希望之前和之后的行),所以我发现它更快地输入命令,只需点击点键有多少个点/多少个字符,如果它是几个,然后点击键,或按住它更多。

例如echo zzzabczzzz | grep -o '.abc…'

会有abc模式,前后有一个点。(在正则表达式语言中,Dot匹配任何字符)。其他人也使用点,但用花括号表示重复。

如果我想在(0或x)字符和恰好y字符之间进行严格的re,那么我会使用curlies..和-P,就像其他人做的那样。

有一个关于点是否匹配新行的设置,但如果它是一个关注/兴趣,你可以查看一下。

其他回答

如果使用ripgreg,你会这样做:

grep -E -o ".{0,5}test_pattern.{0,5}" test.txt 

您可以使用regexp grep来查找+第二个grep来突出显示

echo "some123_string_and_another" | grep -o -P '.{0,3}string.{0,4}' | grep string

23 _string_and

你可以用

awk '/test_pattern/ {
    match($0, /test_pattern/); print substr($0, RSTART - 10, RLENGTH + 20);
}' file

我永远不会轻易记住这些神秘的命令修饰符,所以我把上面的答案变成了~/中的一个函数。bashrc文件:(

cgrep() {
    # For files that are arrays 10's of thousands of characters print.
    # Use cpgrep to print 30 characters before and after search pattern.
    if [ $# -eq 2 ] ; then
        # Format was 'cgrep "search string" /path/to/filename'
        grep -o -P ".{0,30}$1.{0,30}" "$2"
    else
        # Format was 'cat /path/to/filename | cgrep "search string"
        grep -o -P ".{0,30}$1.{0,30}"
    fi
} # cgrep()

下面是它实际运行的样子:

$ ll /tmp/rick/scp.Mf7UdS/Mf7UdS.Source

-rw-r--r-- 1 rick rick 25780 Jul  3 19:05 /tmp/rick/scp.Mf7UdS/Mf7UdS.Source

$ cat /tmp/rick/scp.Mf7UdS/Mf7UdS.Source | cgrep "Link to iconic"

1:43:30.3540244000 /mnt/e/bin/Link to iconic S -rwxrwxrwx 777 rick 1000 ri

$ cgrep "Link to iconic" /tmp/rick/scp.Mf7UdS/Mf7UdS.Source

1:43:30.3540244000 /mnt/e/bin/Link to iconic S -rwxrwxrwx 777 rick 1000 ri

这个文件是一个连续的25K行,使用常规的grep是不可能找到你要找的东西的。

请注意调用与grep方法并行的cgrep的两种不同方式。

有一种“更好”的方法来创建函数,其中“$2”只在设置时传递,这将节省4行代码。不过我手边没有。比如${parm2} $parm2。如果我找到了,我会修改函数和这个答案。

我个人做的事情类似于张贴的答案。但由于点键,像任何键盘键,可以点击或按住..我通常不需要很多上下文(如果我需要更多,我可能会像grep -C一样做行,但经常像你一样,我不希望之前和之后的行),所以我发现它更快地输入命令,只需点击点键有多少个点/多少个字符,如果它是几个,然后点击键,或按住它更多。

例如echo zzzabczzzz | grep -o '.abc…'

会有abc模式,前后有一个点。(在正则表达式语言中,Dot匹配任何字符)。其他人也使用点,但用花括号表示重复。

如果我想在(0或x)字符和恰好y字符之间进行严格的re,那么我会使用curlies..和-P,就像其他人做的那样。

有一个关于点是否匹配新行的设置,但如果它是一个关注/兴趣,你可以查看一下。