grep与sed配合使用一例

本文介绍如何利用grep命令找到特定日志信息所在行,并使用sed命令查看该行附近的上下文内容,适用于内核错误排查及代码调试。

有时候我们需要知道搜索的内容x位于文本文件的哪一行,然后需要查看这一行附近的内容,典型的例子有:

- 查看kernel的dmesg信息时

- 阅读函数实现代码时


可以简单的通过两个命令行解决,举例如下:

$grep -n 'BUG' snow_dmesg.log
10:<4>[    0.000000] BUG: mapping for 0x00b00000 at 0xc0900000 overlaps vmalloc space
664:<2>[   23.566966] kernel BUG at /work2/ICS_8x25/kernel/fs/ext4/extents.c:1996!
665:<0>[   23.573651] Internal error: Oops - BUG: 0 [#1] PREEMPT SMP

这里我搜索一个dmesg的log文件,里面有一个kernel BUG信息,通过grep命令我知道了要找的信息位于664行附近。


然后我希望查看这附件的所有内容,此时可以使用sed命令达到目的:

$sed -n '650,700p' snow_dmesg.log
<3>[   16.800376] init: starting 'atfwd_log'
<3>[   16.800983] init: starting 'atfwd'
<3>[   21.821501] init: starting 'atfwd_log'
<3>[   21.822424] init: starting 'atfwd'
<2>[   23.529703] EXT4-fs error (device mmcblk0p13): ext4_valid_block_bitmap:282: comm er.ServerThread: Invalid block bitmap - block_group = 10, block = 327681
<3>[   23.530108] Aborting journal on device mmcblk0p13-8.
<2>[   23.531563] EXT4-fs (mmcblk0p13): Remounting filesystem read-only
<2>[   23.531753] EXT4-fs error (device mmcblk0p13) in ext4_free_blocks:4643: Journal has aborted
<2>[   23.533381] EXT4-fs error (device mmcblk0p13) in ext4_reserve_inode_write:5641: Journal has aborted
<2>[   23.535013] EXT4-fs error (device mmcblk0p13) in ext4_ext_remove_space:2669: Journal has aborted
<2>[   23.537513] EXT4-fs error (device mmcblk0p13) in ext4_reserve_inode_write:5641: Journal has aborted
<2>[   23.546488] EXT4-fs error (device mmcblk0p13) in ext4_orphan_del:2120: Journal has aborted
<2>[   23.554731] EXT4-fs error (device mmcblk0p13) in ext4_reserve_inode_write:5641: Journal has aborted
<0>[   23.564124] ------------[ cut here ]------------
<2>[   23.566966] kernel BUG at /work2/ICS_8x25/kernel/fs/ext4/extents.c:1996!
<0>[   23.573651] Internal error: Oops - BUG: 0 [#1] PREEMPT SMP
<4>[   23.579118] Modules linked in: sm_event_driver sm_event_log
<4>[   23.584676] CPU: 0    Tainted: G        W    (3.0.21-perf #1)
<4>[   23.590413] PC is at ext4_ext_put_in_cache+0x14/0x48
<4>[   23.595353] LR is at ext4_ext_map_blocks+0x2e0/0x14bc
<4>[   23.600386] pc : [<c01ff260>]    lr : [<c0202a08>]    psr: 60000113
<4>[   23.600391] sp : df647a10  ip : 00000000  fp : df232254
<4>[   23.611848] r10: 00000000  r9 : 00000000  r8 : 00000000
<4>[   23.617053] r7 : 00000000  r6 : df71ac20  r5 : df647b80  r4 : 00000000
<4>[   23.623561] r3 : 00000000  r2 : 00000000  r1 : 00000000  r0 : df2322d0


OK,我已看到到希望查看的内容了。


awk、grepsed 是 Linux 操作文本的三大利器,三者功能都是处理文本,但侧重点各不相同。其中,awk 功能最强大,但也最复杂;grep 更适合单纯地查找或匹配文本;sed 更适合编辑匹配到的文本 [^1]。 ### grep - **功能介绍**:Linux 系统中 grep 命令是一种强大的文本搜索工具,能使用正则表达式搜索文本,并把匹配的行打印出来,其全称是 Global Regular Expression Print,表示全局正则表达式版本,使用权限是所有用户 [^2]。 - **使用方法**:格式为 `grep [options] '要查找的字符串或正则表达式' [文件]`。常用选项如下 [^5]: - `-i`:忽略大小写进行搜索。 - `-e`:指定查找内容,可以跟多个,类似于`'查找内容1'|'查找内容2'`。 - `-v`:显示不匹配模式的行。 - `-c`:计算找到符合行的次数。 - `-w`:精确查找,只能输出完全匹配的内容,类似于`\b要查的内容\b`。 - `-n`:在输出结果中显示行号。 - `-r`:递归搜索目录下的所有文件。 - `-lr`:以长文本格式显示文件名。 - `-E`:使用正则表达式查找。 - **应用场景**:适用于单纯的文本查找或匹配场景,如搜索文件中包含特定字符串或符合正则表达式的行。例如,搜索 `fruits.txt` 中包含字符串 `apple` 的行,可使用命令 `grep "apple" fruits.txt`;搜索 `file.txt` 中包含任意数字的行,可使用命令 `grep "[0-9]" file.txt` [^5]。 ### sed - **功能介绍**:是一种流编辑器,读取文件会进行逐行读取加上指令操作,重点在于增删改查四个功能,可运用在脚本中对重要文件配置的修改、添加等 [^3]。 - **使用方法**:以替换操作为例,格式为 `行范围 s/旧字符串/新字符串/替换标记`。替换标记说明如下 [^3]: - 数字:表明新字符串将替换第几处匹配的地方。 - `g`:表明新字符串将会替换所有匹配的地方。 - `p`:打印替换命令匹配的行, `-n` 一起使用。 - `w 文件`:将替换的结果写入文件中。 - `s`:替换字符串。 - `c`:整行替换。 - `y`:字符替换,替换前后的字符串长度必须相同。 示例: ```bash sed -n 's/root/test/2p' /etc/passwd # 指定第二个root,替换为了test sed -n 's/root/test/gp' /etc/passwd # 所有的root都替换为test sed 's/[A-Z]/\l&/g' test1.txt # 将大写全部转换为小写,\l&是转换小写的一种特殊的符号,前面要加转义符“\” sed 's/[a-z]/\u&/' test1.txt # 把首字母替换成大写,\u&是转换首字母大写的一种特殊的符号,前面要加转义符“\” ``` - **应用场景**:适合对匹配到的文本进行编辑,如替换文件中的特定字符串、修改文件内容等。但处理过大的文件时,需先拆分文件;使用 `-i` 选项时要先备份文件 [^3]。 ### awk - **功能介绍**:更适合格式化文本,对文本进行较复杂格式处理 [^1]。 - **使用方法**:以筛选日志文件 `file.log` 中包含 "error" 的行,并从中提取出时间戳和错误信息,然后进行一些格式化处理为例,命令如下 [^4]: ```bash grep "ERROR" log.txt | awk '{print $1,$2,$5}' | sed 's/\[//g;s/\]//g' ``` - **应用场景**:适用于需要对文本进行复杂格式处理的场景,如从日志文件中提取特定信息并格式化输出。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值