Bash 如何在shell中使用awk参数
我需要使用Bash 如何在shell中使用awk参数,bash,shell,awk,ssh,sh,Bash,Shell,Awk,Ssh,Sh,我需要使用sh-c“command”其中的command是一个带有变量的awk,但我还不能,有人能帮我吗 以下是一个例子: 我有一个有几行的文件,想打印与标记匹配的行数。在本例中,我使用sh,但我还需要使用ssh $ file=file.txt $ mark="xxxx" $ cat $file name surname xxxx phone xxxx more data more more data xxxx continue data $ sh -c "awk -v line=\"$mark
sh-c“command”
其中的command是一个带有变量的awk
,但我还不能,有人能帮我吗
以下是一个例子:
我有一个有几行的文件,想打印与标记匹配的行数。在本例中,我使用sh
,但我还需要使用ssh
$ file=file.txt
$ mark="xxxx"
$ cat $file
name
surname
xxxx
phone
xxxx
more data
more more data
xxxx
continue data
$ sh -c "awk -v line=\"$mark\" '$0 == line {print NR}' $file"
$ awk -v line="$mark" '$0 == line {print NR}' $file
3
5
8
第一次使用sh
运行时不返回任何内容。不带sh
的第二次运行正常
==进一步澄清
我有一个函数“execmd”,它接收两个参数,第一个参数是服务器名称,第二个是带有命令的字符串
execmd ()
{
P_SERV="$1"
P_CMD="$2"
X_SERV=`hostname`
if [ "$P_SERV" = "$X_SERV" ] ; then
sh -c "$P_CMD"
else
ssh -n "$P_SERV" "$P_CMD"
fi
}
如果我跑步:
xx=`execmd earth "awk -v line=\"$mark\" '\$0 == line {print NR}' $file"`; echo $xx
xx是空的
我在execmd中放置了一个echo来查看命令,在de函数中,它将\$0转换为bash
我还有什么要补充的吗?
这是mega脚本的一部分,在这里我可以从一个地方监视多个地方,因此如果我必须在本地运行某个东西,我会使用sh,否则ssh将脚本用单引号括起来,而不是双引号括起来,然后只要打开它们,在必要时在该部分代码中公开shell变量:
$ sh -c 'awk -v line="'"$mark"'" '\''$0 == line {print NR}'\'' file'
3
5
8
在单引号分隔的脚本中“包含”单引号是'\'
,因此这些字符串围绕着awk脚本主体,而不仅仅是'
下面是一个为什么不使用双引号的例子,比如在你的问题下面的评论中,假设你只想打印Eureka代码>每次匹配一行时:
$ sh -c 'awk -v line="'"$mark"'" '\''$0 == line {print NR, "Eureka!"}'\'' file'
3 Eureka!
5 Eureka!
8 Eureka!
与(请注意,我们已经不得不转义$0
):
还有其他的事情要考虑,如果<代码> $Mark 包含球形字符,它会变得更糟。为什么你需要<代码> SHI-C…>代码>你可以试试<代码> SH-C“AWK-V行= $Mark”\ $ 0=行{打印NR}` $file“< /代码>,但是重点是什么呢?用echo替换sh-c
,问题应该是显而易见的。太好了!那有帮助!谢谢Hanks@Ed Morton,你能解释一下单引号和双引号的区别吗?在这种情况下,我为什么要把“$mark”而不仅仅是“$mark”放在一个快速生成的和更多的。您需要行““$mark””
的原因是您希望以line=“xxxx”
结束,要达到这一点,您需要使用“
打开sh-c
命令行,然后提供引用的变量以避免shell扩展全局字符等。因此“$mark”
,然后用重新启动sh-c部件。
。希望这是有道理的。只需数一数引号,并思考每个引号的开始/停止/封闭位置。
$ sh -c "awk -v line=$mark '\$0 == line {print NR, "Eureka!"}' file"
-bash: !"}': event not found