FOR循环返回全路径时如何处理AWK语句中的路径转义问题
解决方案
你之前硬编码路径中加的斜杠转义符是不必要的,向awk传递文件路径时不需要对/做转义,直接使用循环变量$i即可,正确写法如下:
for i in /usr/IBM/WebSphere/AppServer/profiles/AppSrv01/logs/server42c_*/SystemOut.log do # 直接传入$i作为awk的目标文件即可 currentcount=$(awk '/Reason code "68"/' "$i" | wc -l) echo "$i 匹配行数:$currentcount" done
如果确实有场景需要把路径中的/转义为\/(比如要将路径放入awk的正则表达式规则中做匹配),可以直接用bash内置的参数替换实现,不需要调用额外命令:
for i in /usr/IBM/WebSphere/AppServer/profiles/AppSrv01/logs/server42c_*/SystemOut.log do # 全局替换/为转义后的\/ escaped_i=${i//\//\\/} # 示例:awk正则中需要用到路径的场景 currentcount=$(awk '$0 ~ /'"$escaped_i"'/ && /Reason code "68"/' "$i" | wc -l) done
更高效的替代方案
你要统计多个文件中特定字符串的匹配行数,不需要手动写循环,直接用grep的-c参数即可实现,性能更高:
grep -c 'Reason code "68"' /usr/IBM/WebSphere/AppServer/profiles/AppSrv01/logs/server42c_*/SystemOut.log
内容的提问来源于stack exchange,提问作者Configueroa
相关产品推荐
相关产品推荐

