如何用grep匹配指定文本并输出该行及后续三行的指定列?
解决方案
需求回顾
现有文本:
test to print 1 aa ee 0.000 0.000 0.000 2 bb ff 0.000 0.000 0.000 3 cc gg 0 0 0
需通过匹配指定单词(如test to print),提取目标行及后续3行的对应列,输出以下两种格式之一:
格式1(带数字表头)
1 2 3 test to print ee ff gg
格式2(仅核心行)
test to print ee ff gg
实现命令
方式1:grep + awk组合(易读性高)
输出格式2
grep -A3 "test to print" 你的文件名.txt | awk 'NR==1{save=$0} NR>1{cols=cols" "$3} END{printf "%s %s\n", save, cols}'
grep -A3 "test to print":匹配目标行并输出后续3行- awk逻辑:保存第一行内容,拼接后续3行的第3列,最后格式化拼接输出
输出格式1
grep -A3 "test to print" 你的文件名.txt | awk 'NR==1{save=$0} NR>1{nums=nums" "$1; cols=cols" "$3} END{printf "%18s\n%s %s\n", nums, save, cols}'
- 新增
nums变量拼接后续3行的第1列(数字1/2/3),通过%18s让数字行右对齐,和下方文本匹配
方式2:纯awk实现(精简高效)
输出格式2
awk '/test to print/{line=$0; getline; c=$3; getline; c=c" "$3; getline; c=c" "$3; printf "%s %s\n", line, c}' 你的文件名.txt
- 直接匹配目标行,通过
getline读取后续3行,依次提取第3列拼接后输出
输出格式1
awk '/test to print/{line=$0; getline; n=$1; c=$3; getline; n=n" "$1; c=c" "$3; getline; n=n" "$1; c=c" "$3; printf "%18s\n%s %s\n", n, line, c}' 你的文件名.txt
- 同时提取后续3行的第1列(数字)和第3列,分别拼接后格式化输出
内容的提问来源于stack exchange,提问作者Trung Vô
相关产品推荐
相关产品推荐

