如何用grep统计CSV文件中含指定字符串的行数且不显示行内容
问题原因分析
grep语法逻辑错误:grep默认接收的最后一类参数为待读取的文件名,若直接将存储文本内容的变量作为参数传入,grep会将变量拆分后的每段内容识别为文件名检索,最终触发「无此文件或目录」报错。- 自定义
IFS导致内容拆分异常:手动设置IFS=","后,变量$last_rows展开时会按逗号而非默认的换行/空白分割内容,进一步加剧了参数拆分错误。 - 缺少不区分大小写匹配参数:需求要求不区分大小写匹配
Wed,当前grep命令未添加-i参数,无法匹配大小写混合的目标字符串。
正确实现方案
推荐直接通过管道传递文本流,绕开变量展开的各类隐患,代码如下:
INPUT="$1" tail -n 10 "$INPUT" | grep -i -c 'Wed'
实现逻辑说明:
- 管道
|将tail输出的最后10行内容直接作为标准输入传递给grep,无需将内容存储到变量中 -i参数开启不区分大小写匹配-c参数直接输出匹配行数,无需输出匹配行内容
如果确实需要先将内容存入变量再处理,可采用here string传递文本,同时注意备份恢复IFS:
INPUT="$1" # 备份原始IFS OLD_IFS="$IFS" IFS="," last_rows=$(tail -n 10 "$INPUT") # 用<<<将变量内容作为标准输入传递给grep grep -i -c 'Wed' <<< "$last_rows" # 恢复原始IFS,避免影响后续逻辑 IFS="$OLD_IFS"
注意事项
- 所有变量引用建议添加双引号,例如
"$INPUT",避免文件名/内容包含空格、特殊字符时出现异常 - 处理文本流优先使用管道传递,比存储到变量再处理的逻辑更简洁,也能规避shell参数展开的各类潜在问题
内容的提问来源于stack exchange,提问作者HappyDuppy
相关产品推荐
相关产品推荐

