如何在awk中使用变量?我的bash脚本运行遇问题求助
问题分析与修正
你的代码存在三个核心问题,逐个解决:
1. 变量赋值错误
end=some variable 这种写法在bash里是错误的——值包含空格时必须用引号包裹,否则bash会把some赋值给end,把variable当成单独的命令执行,直接报错。正确写法:
end="some variable"
2. for循环无法读取文件内容
for var in 'cat /Desktop/list.txt'; 里的单引号会把整个字符串当成一个循环项,var只会被赋值为cat /Desktop/list.txt这串文本,而不是执行命令后得到的文件内容。如果要读取文件每行内容,推荐用while循环(能正确处理包含空格的行):
while IFS= read -r var; do # 循环逻辑 done < /Desktop/list.txt
如果文件每行没有空格,也可以用for var in $(cat /Desktop/list.txt);,但前者更健壮。
3. awk无法获取bash变量
awk的单引号脚本里,bash变量不会被展开,/$var/,/$end/中的$var和$end是awk的未定义变量(值为空),完全达不到你想要的匹配效果。要把bash变量传递给awk,需要用-v参数:
awk -v awk_var="$var" -v awk_end="$end" '$0 ~ awk_var, $0 ~ awk_end' text.txt
这里-v awk_var="$var"把bash的var变量传递给awk的awk_var,$0 ~ awk_var表示当前行匹配awk_var对应的正则,$0 ~ awk_var, $0 ~ awk_end实现从匹配awk_var的行到匹配awk_end的行的范围输出。
完整修正后的代码
end="some variable" while IFS= read -r var; do awk -v awk_var="$var" -v awk_end="$end" '$0 ~ awk_var, $0 ~ awk_end' text.txt done < /Desktop/list.txt
内容的提问来源于stack exchange,提问作者user19667064
相关产品推荐
相关产品推荐

