如何使用Awk在$2为05/空格/d1时触发shell脚本abc.sh?
用Awk实现指定条件触发Shell脚本的正确方法
问题说明
待处理的文本文件内容:
A 00 B 05 C d1 D
需求:读取这个文件,当第2个字段$2的值是05、空格或者d1时,执行脚本abc.sh;其他情况输出HELLO。
你之前尝试的错误代码:
$ awk '{ if ($2 ==" " && $2 == "05" && $2 == "d1") run abc.sh else print "HELLO" }' –
错误点拆解
- 逻辑判断错误:用了
&&(逻辑与),要求字段同时等于三个完全不同的值,这永远不可能成立。需求是满足任意一个条件,必须用||(逻辑或)。 - 外部命令调用语法错误:Awk中不能直接写
run abc.sh,必须用system()函数来执行外部脚本。 - 转义字符混乱:代码里的
"和&&是HTML转义后的字符,实际编写Awk命令时要使用正常的双引号和||/&&。 - 输入源错误:末尾的
–是无效的输入标识,需要指定目标文件名(比如your_file.txt),或通过管道传递输入内容。
正确实现代码
直接读取文件的写法
awk '{ if ($2 == "05" || $2 == " " || $2 == "d1") { system("./abc.sh") # 脚本在当前目录时用相对路径,否则写全路径 } else { print "HELLO" } }' your_file.txt
管道输入的写法
如果通过管道传递文件内容:
cat your_file.txt | awk '{ if ($2 == "05" || $2 == " " || $2 == "d1") { system("./abc.sh") } else { print "HELLO" } }'
注意事项
- 先给
abc.sh添加执行权限:chmod +x abc.sh,否则会因权限不足报错。 - 若脚本不在当前工作目录,需填写完整路径,比如
/home/user/scripts/abc.sh。 - 文本第四行的
D后方是空格,Awk会将该空格识别为$2,符合触发条件。
内容的提问来源于stack exchange,提问作者User_01
相关产品推荐
相关产品推荐

