Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.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
Linux 使用gawk和shell脚本的单报价问题_Linux_Bash_Awk_Gawk - Fatal编程技术网

Linux 使用gawk和shell脚本的单报价问题

Linux 使用gawk和shell脚本的单报价问题,linux,bash,awk,gawk,Linux,Bash,Awk,Gawk,我正在编写一个小脚本来映射服务器中运行的服务所使用的所有当前内存。然而,我面临着这样做的问题。我的剧本很简单。我正在使用pmap查找正在使用的内存,并尝试将运行的服务的所有pid相加 #!/bin/bash result=`$pgrep java` wc=`$pmap -x $result | wc -l` gawk=`$pmap -x $result | gawk 'NR==$wc{print $3}'` echo "$gawk" 现在,我的问题是gawk在搜索特定模式时使用单引号(gaw

我正在编写一个小脚本来映射服务器中运行的服务所使用的所有当前内存。然而,我面临着这样做的问题。我的剧本很简单。我正在使用pmap查找正在使用的内存,并尝试将运行的服务的所有pid相加

#!/bin/bash
result=`$pgrep java`
wc=`$pmap -x $result | wc -l`
gawk=`$pmap -x $result | gawk 'NR==$wc{print $3}'`

echo "$gawk"

现在,我的问题是gawk在搜索特定模式时使用单引号(gawk'NR==$wc{print$3}'),但shell脚本给了我错误,因为在shell中单引号的含义与gawk不同

根据您的评论,您似乎正在尝试这样做:

pmap -x "$(pgrep java)" | awk '{s=$3}END{print s}'

这将打印
pmap-x
输出最后一行的第三列,其中包含正在运行的java进程的PID。在awk的某些版本中,您可以简单地执行'END{print$3}',但这并不保证有效。

pmap-x$result | gawk'NR==$wc{print$3}'
并没有按照您的想法执行。(我已将您的
$pmap
替换为
pmap
,但我的分析仅限于gawk命令,因此如果该命令不正确,则应该与此无关。)shell将把文本字符串
NR=$wc{print$3}
传递给awk,但是您似乎希望awk看到shell变量
$wc
的值,而不是文本字符串
$wc
。当awk看到
$wc
时,它将
wc
视为一个未初始化的值,因此
$wc
等同于
$0
,awk将打印内容与行号匹配的任何行。将shell变量传递到awk的标准方法是:

pmap -x $result | gawk 'NR==w{print $3}' w=$wc
这将shell变量
wc
分配给awk变量
w
,并将打印该行的第三列


请注意,这个shell脚本有许多问题,但这似乎是核心混淆。

围绕awk脚本的单引号是针对shell的,而不是针对awk的。awk从未见过他们。你到底有什么问题?你犯了什么错误?使用
$(…)
而不是反勾号有帮助吗?(它们有更合理的引用规则,是该功能的现代版本,如果需要可以正确嵌套。)
pmap
是变量名还是命令名?如果是后者,请将前面的
$
去掉。此外,请始终引用shell变量(例如,使用
“$result”
,而不是
$result
),以避免令人讨厌的副作用。因此,基本上,pmap是linux中的一个命令,它基本上将虚拟内存、常驻内存和共享内存相加。我正试图写一个脚本来积累所有正在使用的内存。所以基本上,我在linux命令行中尝试的是#pmap-x1232 | gawk'NR==314{print$3},其中1232是服务器中运行的进程的pid。如果我在命令行中运行该命令,它会工作,但当我将其放入shell中时,单引号不工作,因为在shell中它具有不同的含义。此语句是一个问题,不要将命令用作变量名。-gawk=
$pmap-x$result | gawk'NR==$wc{print$3}'
将shell变量
$wc
传递给awk可以这样做:
awk-vwc=“$wc”'NR==wc{print$3}'
。然而,这似乎是你最不担心的问题……请你的问题向我们展示一个你输入的例子,并解释你试图用它做什么——目前还不清楚。但计算行号以确定哪一行是最后一行只是椒盐卷饼逻辑。@triplee是的,椒盐卷饼逻辑是“问题数”之一!Tom Fenech建议使用END是解决这一特定细节的一个好方法。感谢William Pursell,我不了解椒盐卷饼逻辑,但我很高兴您为我提供的调整确实有效,我非常高兴。我现在有3种不同的方法来做,我真的需要在awk上工作。干杯汉克·汤姆·费内克,我刚刚学到了一些新的东西,它完全起作用了。这正是我想要的调整,老实说,我需要在awk上做的比我预期的更多。您为我提供了两种不同的方法来执行单个任务(awk-vwc=“$wc”'NR==wc{print$3}”)和(pmap-x“$(pgrep java)”| awk'{s=$3}END{print s}'),这两种方法都有效。@linuxarif乐意帮助。别忘了接受答案,将你的问题标记为已解决。您可以通过单击旁边的勾号来执行此操作。