linux - 根据找到第一个模式找到一个模式并打印行 sed, awk grep

标签 linux bash awk sed grep

我有一个相当大的文件。所有人的共同点是打破每个部分示例的主机名:

HOSTNAME:host1
   data 1
     data here
   data 2 
      text here
   section 1
      text here
   part 4  
      data here
   comm = 2

HOSTNAME:host-2

   data 1
     data here
   data 2 
      text here
   section 1
      text here
   part 4  
      data here
   comm = 1

上面的打印

正如您在上面看到的,在每个部分之间还有其他部分,这些部分由具有特定值的关键字或行分割

我喜欢使用 oneliner 打印每个部分的主机名,然后打印我想在每个主机名部分下提取的行

你能帮忙吗?我现在正在使用 grep -C 10 HOSTNAME | gerp -C模式 但这假设每个部分有 10 行。这不是执行此操作的最佳方法;有人可以展示更好的方法吗?我还需要能够在我找到的每个图案下打印多行。因此,如果我找到 data1 并且它下面还有其他行,我想抓取并打印它们

所以命令的输出就像

grep -C 10 HOSTNAME | grep data 1  
grep -C 10 HOSTNAME | grep -A 2 data 1 

HOSTNAME:Host1

   data 1  

HOSTNAME:Hoss2

   data 1 

除了 Grep,我还使用这个 sed 命令来打印我的输出

sed -r '/HOSTNAME|shared/!d' filename

此 sed 命令的唯一问题是它只打印其中包含模式共享和主机名的行。我还需要在匹配共享模式的行下指定我想在我的案例中打印的行数。所以我喜欢打印 HOSTNAME 并给出我想在共享的第二个搜索模式下打印的行数。

谢谢

最佳答案

awk 助您一臂之力!

$ awk -v lines=2 '/HOSTNAME/{c=lines} NF&&c&&c--' file

HOSTNAME:host1
   data 1
HOSTNAME:host-2
   data 1

打印 lines 行数,包括模式匹配,跳过空行。

如果要指定次要关键字而不是行数

$ awk -v key='data 1' '/HOSTNAME/{h=1; print} h&&$0~key{print; h=0}' file

HOSTNAME:host1
   data 1
HOSTNAME:host-2
   data 1

关于linux - 根据找到第一个模式找到一个模式并打印行 sed, awk grep,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35613486/

相关文章:

python - 使用 Saltstack 部署 Python 脚本并测试它是否正常工作

java - 在 Bash 中自动安装需要多次按键的 Java 应用程序

尽管设置了 $PATH 和 shebang,Python 脚本仍然可以从目录运行,但不能作为 CLI cmd

linux - 在格式化的 bash 脚本中比较日期和日志

linux - 如何使用 cat 创建包含 TAB 的文件?

bash - 如何将进度条添加到 shell 脚本

mysql - 当非空结果集时,MySQL 可以给出非零返回码吗?

perl - 使用自定义实用程序进行搜索和替换以进行转换

Linux命令用另一个字符串替换大文件中的字符串

linux - 如何使用 sed 删除双反斜杠