linux - 基于grep模式自定义文件内容显示

标签 linux shell unix scripting

日志文件包含大量数据,并根据数据和时间进行排序。每个日志的大小可能会有所不同。

我想在日志文件中搜索特定模式,如果模式匹配,它应该在屏幕上显示该特定日志。

任何 shell 命令都可以。

日志文件示例:-

07/17/2008 10:24:12.323411 >00.23
Line   441 of xx file
Dest IP Address: 192.189.52.255           Source IP Address: 192.189.52.200 

 000:   0101   0600   4D8C   444C    0000   0000   C0BD   34C8
 008:   C0BD   34C9   C0BD   34C9    0000   0000   FFFF   FFFF


07/17/2008 10:24:12.323549 >000.000138
    Use req data

 000:   0231   7564   705F   7573    7272   6571   2073   6F63

07/17/2008 10:24:12.323566 >000.000017
Local 192.189.52.200  Port 68 : Remote 0.0.0.0         Port 0

 000:   012D                                                   .-               
 000:   0000   0000   000A   0002    000A   012D               ...........-    

   0: NULNUL NULNUL NULLF  NULSTX  NULLF  SOH -               

如果我在这里搜索特定的 ip 地址 192.189.52.200。它应该相应地显示整个事件日志,

07/17/2008 10:24:12.323566 >000.000017
Local 192.189.52.200  Port 68 : Remote 0.0.0.0         Port 0

 000:   012D                                                   .-               
 000:   0000   0000   000A   0002    000A   012D               ...........-    

   0: NULNUL NULNUL NULLF  NULSTX  NULLF  -               

最佳答案

这需要 GNU AWK (gawk),因为使用正则表达式作为记录分隔符 (RS)。

#!/usr/bin/awk -f
BEGIN {
    pattern = ARGV[1]
    delete ARGV[1]

    # could use --re-interval
    d = "[0-9]"
    RS = d d "/" d d "/" d d d d " " d d ":" d d ":" d d "[^\n]*\n"
}

NR > 1 && ($0 ~ pattern || rt ~ pattern) {
    print rt
    print $0
}

{
    rt = RT # save RT for next record
}

虽然不漂亮,但很管用。

像这样运行它:

./script.awk regex logfile

例子:

$ ./script.awk 'C0BD|012D' logfile

07/17/2008 10:24:12.323411 >00.23

Line   441 of xx file
Dest IP Address: 192.189.52.255           Source IP Address: 192.189.52.200

 000:   0101   0600   4D8C   444C    0000   0000   C0BD   34C8
 008:   C0BD   34C9   C0BD   34C9    0000   0000   FFFF   FFFF



07/17/2008 10:24:12.323566 >000.000017

Local 192.189.52.200  Port 68 : Remote 0.0.0.0         Port 0

 000:   012D                                                   .-
 000:   0000   0000   000A   0002    000A   012D               ...........-

   0: NULNUL NULNUL NULLF  NULSTX  NULLF  SOH -

$ ./script.awk '10:24:12.323549' logfile
07/17/2008 10:24:12.323549 >000.000138

    Use req data

 000:   0231   7564   705F   7573    7272   6571   2073   6F63

关于linux - 基于grep模式自定义文件内容显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4813027/

相关文章:

linux - 将两个单词列表合并到一个文件中

linux - 它说 "ftp localhost command not found"。当我使用命令 ftp localhost 在 Linux 中以匿名用户身份登录时

shell - Redis 按哈希值中的模式删除哈希键

linux - 为什么两个进程同时使用一个java命令

c - 从 shell 脚本确定当前代码页的最可靠方法是什么?

unix - grep 文件并将整行保存到变量中

Linux 脚本计数器无法正常工作

c++ - 如何使用 sigsegv 捕获内存读取和写入?

java - 如何使用 shell 脚本从 .jar 文件复制文件夹

c++ - 如何在不删除 .o 文件的情况下使用 makefile 进行编译?