如何定位文本中首次出现连续两行null的起始行号?
查找文本中首次连续两行
null的起始行号 需求说明
需要定位文本文件中首次出现连续两行值为null的起始行号。以下是示例输入:
It's My Life - Bon Jovi It's My Life - Bon Jovi It's My Life - Bon Jovi null When Doves Cry (Mixed) - Prince & The Revolution When Doves Cry (Mixed) - Prince & The Revolution When Doves Cry (Mixed) - Prince & The Revolution The Sign - Ace of Base The Sign - Ace of Base null null null null null null null It's Tricky - Run-DMC It's Tricky - Run-DMC The Tide Is High - Blondie The Tide Is High - Blondie null null null Plush - Stone Temple Pilots Plush - Stone Temple Pilots
该示例中,首次连续两行null的起始行号为10,是期望输出结果。
当前问题
使用命令 grep -n -A2 "null" trim.log | cut -f1 -d: 会输出大量冗余内容,无法直接得到目标行号:
4 5-When Doves Cry (Mixed) - Prince & The Revolution 6-When Doves Cry (Mixed) - Prince & The Revolution -- 10 11 12 13 14 15 16 17-It's Tricky - Run-DMC 18-It's Tricky - Run-DMC -- 21 22 23 24-Plush - Stone Temple Pilots 25-Plush - Stone Temple Pilots
解决方案
方法1:使用awk(推荐)
awk适合处理行关联的匹配逻辑,直接定位首次连续两行null的起始行号:
awk 'prev == "null" && $0 == "null" {print NR-1; exit} {prev = $0}' trim.log
逻辑说明:
prev == "null" && $0 == "null":判断当前行和上一行内容均为nullprint NR-1:输出连续两行的起始行号(当前行号NR减1)exit:找到第一个匹配项后立即退出,确保只输出首次出现的结果{prev = $0}:将当前行内容存入变量prev,供下一行判断使用
方法2:改进grep+awk组合
如果偏好使用grep工具,可以结合awk过滤出目标行号:
grep -n "null" trim.log | awk '$1 == prev+1 {print prev; exit} {prev=$1}' FS=":"
逻辑说明:
grep -n "null" trim.log:先提取所有null行的行号和内容awk '$1 == prev+1 {print prev; exit} {prev=$1}' FS=":":以冒号为分隔符,判断当前行号是否是上一行号+1,满足则输出上一行号并退出
内容的提问来源于stack exchange,提问作者khofm
相关产品推荐
相关产品推荐

