如何用grep仅提取文件首个空行的行号并赋值给Shell变量
实现仅提取首个空行行号并赋值变量的方案
可通过给grep增加提前终止参数、简单处理输出字段的方式实现需求,无需遍历整个文件即可拿到目标值:
- 核心优化:给grep加上
-m 1(即--max-count=1)参数,让grep找到第一个符合条件的空行就立刻停止扫描文件。相比管道接head -n1的方案,该操作能大幅降低大文件场景的不必要性能消耗:如果不加这个参数,哪怕后续管道只取第一行结果,grep也会遍历完整个文件才会退出。 - 字段处理:原有命令的输出格式为
文件名:行号:行内容,在找到第一条匹配结果后,仅需提取中间的行号字段即可得到目标值。
具体赋值命令示例
# 保留原有grep参数的写法,适合文件名不含冒号的场景 first_blank_line=$(grep -m1 -E --line-number --with-filename '^$' filename | cut -d: -f2) # 更鲁棒的写法(不受文件名是否包含冒号的影响) # 去掉--with-filename参数,让grep仅输出匹配的行号,再截掉末尾多余的冒号 first_blank_line=$(grep -m1 -n '^$' filename | cut -d: -f1)
执行完成后,first_blank_line变量就会存储示例场景下的122值。
补充说明
- 不要省略
-m1参数:如果写成grep -E --line-number --with-filename '^$' filename | head -n1 | cut...,grep进程依然会扫描完整份文件,在GB级以上的大文件场景下会产生无意义的IO开销。 - 如果空行包含首尾空格,可将匹配规则调整为
^[[:space:]]*$,避免把全空白字符的行误判为非空行。
内容的提问来源于stack exchange,提问作者Jack Howard
相关产品推荐
相关产品推荐

