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 在shell中解析ps和grep输出_Linux_Bash_Shell_Grep_Cgi - Fatal编程技术网

Linux 在shell中解析ps和grep输出

Linux 在shell中解析ps和grep输出,linux,bash,shell,grep,cgi,Linux,Bash,Shell,Grep,Cgi,当我执行“ps-ef | grep端口”时,会收到以下消息 有没有办法解析以下内容: 开始时间(11:20) 序列号(4123E) sku(HSME01-HW) 港口(8) 因为问题被标记为bash,所以最好只使用bash解决方案(没有awk或perl) LINE='apache 6215 1 0 11:20 ? 00:00:00 perl /scripts/myscript.pl -sn 4123E -sku HSME01-HW -port 8' ## Con

当我执行“ps-ef | grep端口”时,会收到以下消息

有没有办法解析以下内容:

  • 开始时间(11:20)
  • 序列号(4123E)
  • sku(HSME01-HW)
  • 港口(8)

因为问题被标记为
bash
,所以最好只使用bash解决方案(没有awk或perl)

LINE='apache    6215     1  0 11:20 ?        00:00:00 perl /scripts/myscript.pl -sn 4123E -sku HSME01-HW -port 8'

## Convert string to bash array
ARR=($LINE)

echo "start time (${ARR[4]})"
echo "sn (${ARR[10]})"
echo "sku (${ARR[12]})"
echo "port (${ARR[14]})"

## How to save the value?
START_TIME=${ARR[4]}

您可以使用
awk
进行过滤和解析:

ps -ef | awk '/[p]ort/ {printf "start time: %s\nsn: %s\nsku: %s\nport: %s\n", $5, $11, $13, $NF}'

正如glenn jackman在评论中指出的那样,筛选器字符串中的方括号阻止表达式与流程列表中的筛选器字符串本身匹配。

标题中不应出现“grep”,但这不是-1新手而不是回答他的问题的理由!与其说是“有多少种不同的方法可以解析输出”,不如说是“有什么方法可以解析输出”。您可能会发现
ps-eo start\u time,args
更容易解析,因为这也可能会从ps输出中选取awk命令,请使用
/[p]ort/
过滤hanks Ansgar。有人能给我解释一下$5、$11、$13、$NF是什么意思或对应于什么吗?@Jeremy
awk
自动将输入行拆分为字段(默认分隔符为空白)。这些字段可以通过变量
$1
$2
$3
等进行访问。
$NF
是一个特殊变量,具有输入行最后一个字段的值(NF表示“字段数”)。在你的情况下,你也可以使用
$15
,但有时如果你不需要事先知道字段的实际数量,那就更方便了。我意识到这篇文章是几年前写的,但是,作为一个新手,我想知道如何从ps解析多个结果,比如cups或sshd之类的进程,而不仅仅是如上所述的“LINE=apache…etc”。TIA@endorpheus您可以一次解析一行,对吗?(使用
|同时读取行
)我不确定您从cups或sshd获得了什么输出。也许您应该作为一个新问题来提问。不需要,您回答了我的问题,谢谢,@saeedgnu
ps -ef | awk '/[p]ort/ {printf "start time: %s\nsn: %s\nsku: %s\nport: %s\n", $5, $11, $13, $NF}'