日志提取缺失文件日期脚本报Bad substitution错误求助
问题解决与实现方案
错误原因分析
你遇到的Bad substitution错误,是因为脚本里的${echo $(awk '{if($1 -eq "gawk")print $4}' datafile.txt):-14,8}完全不符合Bash语法规则:
- Bash的参数替换
${...}内部不能直接嵌套echo命令; - 你想实现的字符串切片语法写错了,正确的切片格式是
${变量名:起始位置:长度},但直接处理多行命令输出时,用Bash切片会非常繁琐,不如直接用Awk完成文本提取更高效; - 原Awk命令里的
$1 -eq "gawk"用了数值比较符-eq,字符串比较应该用==。
正确实现脚本
直接用Awk一步完成日志分析与日期提取,无需复杂的Bash字符串处理,完整脚本如下:
#!/bin/bash # 提取缺失文件对应的日期并输出到outfile.txt awk '/gawk:/ { # 匹配行中的8位数字日期 match($0, /[0-9]{8}/) print substr($0, RSTART, RLENGTH) }' datafile.txt > outfile.txt
脚本说明
/gawk:/:只处理包含gawk:的错误行(即记录文件缺失的行);match($0, /[0-9]{8}/):在当前行中匹配8位数字的日期串;substr($0, RSTART, RLENGTH):提取匹配到的8位日期并打印;- 最后将结果重定向到
outfile.txt,符合你的期望输出格式。
执行该脚本后,outfile.txt内容将完全符合需求:
20091013 20091015 20091016 20091018
内容的提问来源于stack exchange,提问作者Kay
相关产品推荐
相关产品推荐

