如何用grep提取文件奇偶行并获取匹配结果的下一行?
用grep结合工具提取奇偶行并获取匹配行下一行
grep本身没有直接筛选奇偶行的选项,但可以结合awk、sed等工具实现需求,以下是针对不同场景的解决方案:
1. 仅在奇数行中搜索模式,同时输出匹配行及其下一行(原文件的偶数行)
如果需求是在原文件的奇数行里查找匹配项,然后输出该奇数行和它的下一行(原文件的偶数行),用awk可以直接完成,比grep+管道更精准:
awk 'NR%2==1 && /pattern/ {print; getline; print}' filename
NR%2==1:筛选原文件的奇数行/pattern/:匹配目标模式print; getline; print:先打印匹配的奇数行,再读取并打印下一行(偶数行)
2. 仅在偶数行中搜索模式,同时输出匹配行及其下一行
类似地,筛选偶数行并输出匹配行+下一行:
awk 'NR%2==0 && /pattern/ {print; getline; print}' filename
3. 结合你Perl脚本中的递归搜索需求
你的现有grep命令用于递归搜索特定文件、排除大量目录,要把奇偶行筛选逻辑结合进去,可直接用find+awk替代原grep命令,实现更精准的控制:
@rows = `LANG=en_US.UTF-8 find $include_dirs -type f -name "image_args_search_*.txt" ! -path "*/.misc/*" ! -path "*/.image_args/*" ! -path "*/.image_args_clean/*" ! -path "*/.image_args_text/*" ! -path "*/.image_args_init/*" ! -path "*/buscar/*" ! -path "*/.config/*" ! -path "*/*_bak*/*" ! -path "*/indexacao_de_*/*" ! -path "*/.cgi/*" ! -path "*/.pl/*" ! -path "*/imagens/*" ! -path "*/loaded_dispenses/*" ! -path "*/1o_tabeliao_de_notas_de_jundiai/*" ! -path "*/*_orig/*" ! -path "*/checar/*" ! -path "*/indexar/*" -exec awk -v pat="$operator" "NR%2==1 && tolower(\$0) ~ tolower(pat) {print FILENAME\":\"\$0; getline; print FILENAME\":\"\$0}" {} +`;
说明:
- 用
find替代grep递归,精准排除指定目录 tolower()实现不区分大小写匹配(对应原grep的-i)FILENAME":"$0保留原grep的「文件名+行内容」输出格式(对应原grep的-H)
补充:单纯提取奇偶行(不关联下一行)
如果仅需提取奇数/偶数行再搜索模式,可先用sed筛选行,再管道给grep:
- 提取奇数行并搜索:
sed -n '1~2p' filename | grep "pattern"
- 提取偶数行并搜索:
sed -n '2~2p' filename | grep "pattern"
注意:这种方式下,若用grep -A1,输出的「下一行」是sed筛选后的相邻行(同为奇数/偶数行),而非原文件的对应行。
内容的提问来源于stack exchange,提问作者Marcos Camargo
相关产品推荐
相关产品推荐

