找到图案后仅打印输出


13

有一个脚本(我们称它为echoer)可以打印以显示大量信息。我希望只能在找到图案后才能看到线条。

我想象一种解决方案的用法看起来像

echoer | solution_command <pattern>

理想情况下pattern将是一个正则表达式,但是硬值字符串对我而言就足够了。


那么模式可以是多个字符串吗?

一团糟?你是说正则表达式吗?球形仅对文件名扩展有意义。
terdon

@Inian我不确定我是否理解这个问题。您是否要问我是否希望此功能与其他功能配合使用?
user23146

Answers:


21

AWK可以使用模式范围来做到这一点,这允许使用任何正则表达式:

echoer | awk '/pattern/,0'

echoer从第一行匹配开始打印输出pattern

AWK基于模式,通常与“如果此模式匹配,请执行此操作”类型的方法一起使用。“此模式”可以是一系列模式,定义为“当此模式匹配时,开始执行此操作,直到该其他模式匹配”;如上所述,这可以通过编写两个用逗号分隔的模式来指定。模式可以是文本匹配,例如中的/pattern/,其中根据模式检查当前行,将其解释为正则表达式;它们也可以是通用表达式,可以为每一行求值,并且如果它们的结果为非零或非空,则认为它们匹配。

在AWK中,默认操作是打印当前行。

将所有这些放在一起,awk '/pattern/,0'查找匹配的行pattern,找到一个匹配的行,对所有行应用默认操作,直到0条件匹配(非零)。awk '/pattern/,""'也会工作。

Gawk的手动进入更多的细节。


3
我不知道以范围结尾为零的范围语义。谢谢!
Kusalananda

@StephenKitt这太好了!如果我想打印直到匹配该0怎么办?会/pattern/,/0/吗?明确地写出默认操作的答案看起来像什么?
user23146

@ user23146是,/pattern/,/0/将打印直到找到包含“ 0”的行(记录)。用明确的动作在答案中写摘录给出/pattern/,0 { print $0 }或等同地/pattern/,0 { print }
史蒂芬·基特

7

sed@StephenKitt的强制性等效项awk

sed '/pattern/,$!d'

pattern那里被解释为基本正则表达式grep(而不是扩展正则表达式awk/ egrep/ grep -E)。某些sed实现具有-E(BSD,ast,最近的GNU / busybox,即将推出POSIX)或-r(GNU,ssed,busybox,一些近期的BSD)选项来使其成为扩展正则表达式,-P另一些具有(ast)或-R(ssed)使其成为扩展正则表达式。类似perl的正则表达式。

perl

perl -ne 'print if /pattern/ .. undef'

4

使用GNU和* BSD grep:

grep -A1000000000 pattern file

除非文件的行数超过1M,否则就是这样。


0

如果您使用的是寻呼机,例如less查看命令的输出

less +pattern

0

awk 用于第一个模式匹配之后(但不包括)的行

如果包含触发模式的行与“ CUT HERE”等效,则可以从打印输出中将其忽略:

echoer | awk 'flag ; /pattern/ { flag=1 }'

输入的每一行都通过awk代码中的两个组件运行。第一个组件是flag,awk将其解释为“如果变量flag为非零,则打印行”。由于awk变量默认为0,因此最初不会打印任何内容。

第二个组件,/pattern/ { flag=1 }一旦检测到模式,就将标志设置为1,并且该标志在其余的运行中保留该值。

到第一次检测到图案时,已经打印该行输入的机会已经过去。任何后续行(包括包含该模式的其他行)都将打印。


0

重击

有点笨拙,但可以。

#!/bin/bash
found=false
while IFS= read -r; do
    if $found || [[ $REPLY =~ pattern ]]; then
        found=true
        printf '%s\n' "$REPLY"
    fi
done

此版本依赖cat,但更易于理解。

#!/bin/bash
while IFS= read -r; do
    if [[ $REPLY =~ pattern ]]; then
        printf '%s\n' "$REPLY"
        break
    fi
done
cat
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.