如何用Python实现Linux命令grep -A功能及匹配后打印n行
实现Linux
grep -A 功能的Python代码方案 如果你想在Python里实现和Linux grep -A N 一样的效果——也就是匹配到指定字符串后,打印匹配行加上后续的N行内容,咱们可以用几种不同的方式来实现,下面我给你详细说说:
方法1:逐行读取(适合大文件)
这种方式不会一次性把整个文件加载到内存里,处理大文件的时候更高效,完全模拟grep -A的原生行为:
def grep_after(pattern, filename, n_lines): with open(filename, 'r') as f: match_found = False remaining_lines = 0 for line in f: line = line.rstrip('\n') # 保留原行格式,避免重复打印换行符 if match_found: print(line) remaining_lines -= 1 if remaining_lines == 0: match_found = False if pattern in line: print(line) match_found = True remaining_lines = n_lines # 调用示例:完美模拟 grep -A 10 'foo' bar.txt grep_after('foo', 'bar.txt', 10)
代码逻辑拆解:
- 用
with语句打开文件,自动处理文件关闭,避免资源泄漏 - 遍历每一行时,先检查是否处于「需要打印后续行」的状态:如果是,就打印当前行,同时减少剩余需要打印的行数,直到为0就退出该状态
- 如果当前行匹配到目标字符串,先打印该行,然后开启「打印后续行」的状态,设置需要打印的行数为
n_lines
方法2:一次性读入内存(适合小文件)
如果你的文件体积不大,可以直接把所有行读入列表,然后通过索引定位匹配行,再切片打印后续内容:
def grep_after_small_file(pattern, filename, n_lines): with open(filename, 'r') as f: lines = [line.rstrip('\n') for line in f] for idx, line in enumerate(lines): if pattern in line: # 避免切片超出文件长度,用min限制结束索引 end_idx = min(idx + 1 + n_lines, len(lines)) print('\n'.join(lines[idx:end_idx])) # 调用示例 grep_after_small_file('foo', 'bar.txt', 10)
效果验证
针对你给出的示例输入,运行上面的代码会输出:
foo
3.19 EUR Normal GOOD false N 1
完全和grep -A 10 'foo' bar.txt的输出一致。
内容的提问来源于stack exchange,提问作者Dipankar Nalui
相关产品推荐
相关产品推荐

