我如何循环遍历 shell 命令的输出?

2024-10-12 10:28:00
admin
原创
233
摘要:问题描述:我想编写一个脚本,循环遍历 shell 命令的输出(可能是数组?)ps。以下是命令和输出:$ ps -ewo pid,cmd,etime | grep python | grep -v grep | grep -v sh 3089 python /var/www/atm_securit ...

问题描述:

我想编写一个脚本,循环遍历 shell 命令的输出(可能是数组?)ps

以下是命令和输出:

$ ps -ewo pid,cmd,etime | grep python | grep -v grep | grep -v sh
 3089 python /var/www/atm_securit       37:02
17116 python /var/www/atm_securit       00:01
17119 python /var/www/atm_securit       00:01
17122 python /var/www/atm_securit       00:01
17125 python /var/www/atm_securit       00:00

将其转换为 bash 脚本(片段):

for tbl in $(ps -ewo pid,cmd,etime | grep python | grep -v grep | grep -v sh)
do
   echo $tbl
done

但输出变成:

3089
python
/var/www/atm_securit
38:06
17438
python
/var/www/atm_securit
00:02
17448
python
/var/www/atm_securit
00:01

我如何像在 shell 输出中一样在 bash 脚本中循环遍历每一行?


解决方案 1:

如果您想逐行处理 shell 命令的结果,切勿for循环处理,除非您将内部字段分隔符 $IFS的值更改为`
`。这是因为这些行将受到分词的影响,从而导致您看到的实际结果。这意味着如果您有这样的文件:

foo bar
hello world

以下 for 循环

for i in $(cat file); do
    echo "$i"
done

给你:

foo
bar
hello
world

即使你使用`IFS='
'`行可能仍然会得到文件名扩展的主题


我建议使用while+read因为read它可以逐行读取。

pgrep此外,如果您要搜索属于某个二进制文件的 pid,我会使用。但是,由于 python 可能显示为不同的二进制文件,例如python2.7python3.4我建议传递-f给它pgrep,这使它搜索整个命令行,而不仅仅是搜索名为的二进制文件python。但这也会找到已启动的进程,例如cat foo.py。您已被警告!最后,您可以pgrep根据需要优化传递给的正则表达式。

例子:

pgrep -f python | while read -r pid ; do
    echo "$pid"
done

或者如果您还想要进程名称:

pgrep -af python | while read -r line ; do
    echo "$line"
done

如果您希望将进程名称和 pid 放在单独的变量中:

pgrep -af python | while read -r pid cmd ; do
    echo "pid: $pid, cmd: $cmd"
done

您会看到,read提供了一种灵活而稳定的方法来逐行处理命令行的输出。


顺便说一句,如果您ps .. | grep更喜欢使用命令行,pgrep请使用以下循环:

ps -ewo pid,etime,cmd | grep python | grep -v grep | grep -v sh \ n  | while read -r pid etime cmd ; do
    echo "$pid $cmd $etime"
done

etime注意我如何更改和的顺序cmd。这样就可以将cmd可能包含空格的读入单个变量。这样做是因为它read将该行分解为变量,次数与您指定的变量相同。该行的剩余部分(可能包括空格)将分配给命令行中指定的最后一个变量。

解决方案 2:

我发现只需使用双引号就可以做到这一点:

while read -r proc; do
     #do work
done <<< "$(ps -ewo pid,cmd,etime | grep python | grep -v grep | grep -v sh)"

这会将每一行保存到数组中,而不是每个项目。

解决方案 3:

在 bash 中使用for循环时,它默认通过 来拆分给定的列表,这可以通过使用所谓的内部字段分隔符(简称 )whitespaces来进行调整。IFS

IFS 内部字段分隔符,用于扩展后的单词分割以及使用内置命令 read 将行分割为单词。默认值为“”。

对于您的示例,我们需要告诉IFSnew-lines其用作断点。

IFS=$'
'

for tbl in $(ps -ewo pid,cmd,etime | grep python | grep -v grep | grep -v sh)
do
   echo $tbl
done

此示例在我的计算机上返回以下输出。

  668 /usr/bin/python /usr/bin/ud    03:05:54
27892 python                            00:01

解决方案 4:

这是另一个基于 bash 的解决方案,受到@Gordon Davisson的评论的启发。

为此,我们需要(至少 bash v1.13.5 (1992)或更高版本),因为使用了Process-Substitution2、3、4等。 while read var; do { ... }; done < <(...);

#!/bin/bash
while IFS= read -a oL ; do {  # reads single/one line
    echo "${oL}";  # prints that single/one line
};
done < <(ps -ewo pid,cmd,etime | grep python | grep -v grep | grep -v sh);
unset oL;

注意:您可以在其中使用任何简单或复杂的命令/命令集,<(...)其中可能有多条输出行。这里

显示了哪段代码执行什么功能。

这是一个单一/单行的方式:

while IFS= read -a oL ; do { echo "${oL}"; }; done < <(ps -ewo pid,cmd,etime | grep python | grep -v grep | grep -v sh); unset oL;

(由于 Process-Substitution 尚不是 POSIX 的一部分,因此许多符合 POSIX 的 shell 或 bash-shell 的 POSIX shell 模式都不支持它。 Process-Substitution 自 1992 年以来就存在于 bash 中(所以从现在起/2020 年是 28 年前),并且存在于 ksh86(1985 年之前)1中。所以 POSIX 应该将它包含在内。)

如果您或任何用户想要在符合 POSIX 的 shell 中使用类似于 Process-Substitution 的东西(即:sh、ash、dash、pdksh/mksh 等),请查看NamedPipes。

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   2577  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1553  
  IPD(Integrated Product Development)流程作为一种先进的产品开发管理模式,在众多企业中得到了广泛应用。其中,技术评审与决策评审是IPD流程中至关重要的环节,它们既有明显的区别,又存在紧密的协同关系。深入理解这两者的区别与协同,对于企业有效实施IPD流程,提升产品开发效率与质量具有重要意义...
IPD管理流程   26  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、ClickUp、Freshdesk、GanttPRO、Planview、Smartsheet、Asana、Nifty、HubPlanner、Teamwork。在当今快速变化的商业环境中,项目管理软件已成为企业提升效率、优化资源分配和确保项目按时交付的关键工具。然而...
项目管理系统   21  
  建设工程项目质量关乎社会公众的生命财产安全,也影响着企业的声誉和可持续发展。高质量的建设工程不仅能为使用者提供舒适、安全的环境,还能提升城市形象,推动经济的健康发展。在实际的项目操作中,诸多因素会对工程质量产生影响,从规划设计到施工建设,再到后期的验收维护,每一个环节都至关重要。因此,探寻并运用有效的方法来提升建设工程...
工程项目管理制度   18  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用