bash - grep (awk) 从 A 到第一个空行的文件

标签 bash awk grep

我需要从包含 Pattern A 的行到第一个空行进行 grep 文件。 我使用了 awk 但我不知道如何编写这个空行。

cat ${file} | awk '/Pattern A/,/Pattern B/'

最佳答案

sed 可能是最好的:

sed -n '/PATTERN/,/^$/p' file

为了避免打印空行:

sed -n '/PATTERN/,/^$/{/^$/d; p}' file

甚至更好 - thanks jthill! :

sed -n '/PATTERN/,/^$/{/./p}' file

如果 PATTERN 出现不止一次,上述解决方案将提供比需要更多的输出。为此,最好在找到空行后退出,如jaypal's answer suggests。 :

sed -n '/PATTERN/,/^$/{/^$/q; p}' file

说明

  • ^$ 匹配空行,因为 ^ 代表行首,$ 代表行尾。因此,^$ 表示:在行首和行尾之间不包含任何内容的行。
  • /PATTERN/,/^$/{/^$/d; p
    • /PATTERN/,/^$/ 匹配从 PATTERN 到空行的行。
    • {/^$/d; p} 删除 (d) ^$ 格式的行,打印 (p) 其余部分。
  • {/./p} 只打印那些至少有一个字符的行。

通过 awk,您可以使用:

awk '!NF{f=0} /PATTERN/ {f=1} f' file

sed 相同,如果它有很多行带有 PATTERN,它将失败。为此,让我们在找到空行后退出:

awk 'f && !NF{exit} /PATTERN/ {f=1} f' file

说明

  • !NF{f=0} 如果没有字段(即行为空),取消设置标志 f
  • /PATTERN/{f=1} 如果找到 PATTERN,则设置标志 f
  • f 如果设置了标志 f,则为 True,因此它执行默认的 awk 行为:打印该行。

测试

$ cat a
aa
bb
hello
aaaaaa
bbb

ttt

$ awk '!NF{f=0} /hello/ {f=1} f' a
hello
aaaaaa
bbb
$ sed -n '/hello/,/^$/{/./p}' a
hello
aaaaaa
bbb

关于bash - grep (awk) 从 A 到第一个空行的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23831767/

相关文章:

linux - 使用 grep 和 awk 过滤 ping 结果完全不起作用

linux - 在文本文件文件中搜索数字并指定范围和长度 Grep

bash - 将变量从 bash 脚本传递到 makefile

Linux parents 文件的父路径

python - Python 中的 subprocess.call 没有此类文件或目录错误

Bash 数组变量 : [@] or [*]?

awk - 使用 awk gsub 替换 CSV 文件一列中的字符

shell - 使用 awk 和并行同时处理多个文件

awk - 为什么 awk 删除空行

linux - 从 Linux 控制台的输出中提取字符串