linux - 如何打印模式中的第 n 行?

标签 linux bash sed awk grep

我正在尝试制作一个脚本来以短格式总结包含以下日志的文件。

日志片段:

$ cat input.txt
ffffff     1301 2012-08-29T03:13:33 clr         crit
Some serious problem
cccc                            dddddd        eeeeee
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
Some serious problem in system.

ffffff     1302 2012-08-29T03:13:33 set         min
Some serious problem
cccc                            dddddd        eeeeee
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
Some minor problem in system. 

期望的输出:

2012-08-29T03:13:33 clr crit Some serious problem in system.
2012-08-29T03:13:33 set min Some minor problem in system. 

我尝试了以下方法:

$ cat input.txt | grep -iE "set|upd|clr" | awk '{print $3,$4,$5}' >file1
12-08-29T03:13:33  clr crit
12-08-29T03:13:33  set min

下面的命令给了我模式“T”的第 5 行,但问题出在所需的文本行上,在某些情况下它在第 5 行,在某些情况下它在第 4 行。

$ awk '/T/ { show[NR+4]++  } show[NR]' input.txt >file2

$ paste file1 file2 

查询:

在某些情况下它在第 5 行,在某些情况下它在第 4 行。我怎样才能确保找到准确的文本。如果可能,请告诉我。

最佳答案

解决此问题的正确方法是将 awks Record Separator 设置为空字符串,以便 awk 知道您的输入记录由空行分隔:

$ awk -v RS= -F'\n' '{split($1,a,/ +/); print a[3],a[4],a[5],$NF}' file
2012-08-29T03:13:33 clr crit Some serious problem in system.
2012-08-29T03:13:33 set min Some minor problem in system.

那样的话,如果/当你想在将来打印记录的其他部分或打印记录数或仅打印基于某些关键字段或其他任何内容的唯一记录时,这绝对是微不足道的,因为 awk 知道并且是对记录进行操作。

关于linux - 如何打印模式中的第 n 行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19002679/

相关文章:

linux - 空字符串作为 Cut 的输出字段分隔符

linux - 是否有 SunOS、Aix、HP 的 signalfd()、eventfd() API?

git - 如何以编程方式确定当前 checkout 的 Git 分支

linux - 从多行输出中复制特定字符串并将其分配给变量

使用 sed 命令从文本文件中提取字符串

c - 文件打开成功但读取结果为 "Bad file descriptor"错误并且统计显示文件大小为零

Linux sed 以通用方式替换单词

bash - 在 Bash 中获取精确引用的字符串参数

regex - Linux bash 脚本 - 替换文件中最后一次出现的字符串

python - 删除小于前一个值的数值