Bash 在反勾选的AWK表达式中具有命令行参数
我有一个脚本,其中我运行了一个管道,最后一个命令是Bash 在反勾选的AWK表达式中具有命令行参数,bash,Bash,我有一个脚本,其中我运行了一个管道,最后一个命令是awk,我想在该部分放置一个命令行参数 OUTPUT=`sort -t' ' -k +6,6 -k +7,7 | awk '{print " $1"$0}'` 我希望最后的$1是我在运行脚本时收到的参数,而不是被视为一美元一字符串并由awk命令解析 是否有一个优雅的解决方案,或者我应该只传递awk部分,然后迭代输出的每一行,并添加我想用awk添加的空格和参数?使用-v $: set -- foo # set $1 for this
awk
,我想在该部分放置一个命令行参数
OUTPUT=`sort -t' ' -k +6,6 -k +7,7 | awk '{print " $1"$0}'`
我希望最后的$1
是我在运行脚本时收到的参数,而不是被视为一美元一字符串并由awk
命令解析
是否有一个优雅的解决方案,或者我应该只传递awk
部分,然后迭代输出的每一行
,并添加我想用awk
添加的空格和参数?使用-v
$: set -- foo # set $1 for this example
$: awk -v arg1=$1 '{print " ", arg1, $0}' < someInput
$:set--foo#本例设置$1
$:awk-v arg1=$1'{print',arg1,$0}'
或者没有空间(更像你的空间)
$:awk-v arg1=$1'{print”“arg1$0}'
c、 (在本例中为GNU)最简单的解决方案是使用“unquote requote”技巧将
$1
移到单引号之外:
OUTPUT=`sort -t' ' -k +6,6 -k +7,7 | awk '{print " '$1'"$0}'`
如果您还没有执行命令,您可能还想在脚本中的该命令之前取消设置IFS
,以防止“分词”。否则,bash
将“编辑”掉所有额外的空白,包括换行符:
IFS=
OUTPUT=`sort -t' ' -k +6,6 -k +7,7 | awk '{print " '$1'"$0}'`
养成使用
$(command)
而不是反勾号的习惯是个好主意,顺便说一句。有关详细信息,请参阅和。@Shawn甚至不知道这是可能的。谢谢你的提示。这是脆弱的,因为它依赖于$1
不包含任何字符,这些字符将改变awk
脚本的解析方式。@chepner它仍然在awk中的双引号内,所以我认为除了嵌入双引号之外,它对任何东西都是脆弱的,我怀疑它是否可能是脆弱的。但这一点是正确的。
IFS=
OUTPUT=`sort -t' ' -k +6,6 -k +7,7 | awk '{print " '$1'"$0}'`