Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 如何在shell中使用awk参数_Bash_Shell_Awk_Ssh_Sh - Fatal编程技术网

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