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

2024-10-12 10:28:00
admin
原创
227
摘要:问题描述:我想编写一个脚本,循环遍历 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大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   2079  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1459  
  建筑行业正处于数字化转型的关键时期,建筑产品生命周期管理(PLM)系统的实施对于提升项目效率、质量和协同性至关重要。特别是在 2025 年,基于建筑信息模型(BIM)的项目进度优化工具成为众多建筑企业关注的焦点。这些工具不仅能够整合项目全生命周期的数据,还能通过精准的分析和模拟,为项目进度管理提供强大支持。BIM 与建...
plm是什么软件   0  
  PLM系统开发的重要性与现状PLM(产品生命周期管理)系统在现代企业的产品研发、生产与管理过程中扮演着至关重要的角色。它贯穿产品从概念设计到退役的整个生命周期,整合了产品数据、流程以及人员等多方面的资源,极大地提高了企业的协同效率和创新能力。通过PLM系统,企业能够实现产品信息的集中管理与共享,不同部门之间可以实时获取...
国产plm软件   0  
  PLM(产品生命周期管理)系统在企业产品研发与管理过程中扮演着至关重要的角色。随着市场竞争的加剧和技术的飞速发展,企业对PLM系统的迭代周期优化需求日益迫切。2025年敏捷认证对项目管理提出了新的要求,其中燃尽图作为一种强大的可视化工具,在PLM系统迭代周期优化中有着广泛且重要的应用。深入探讨这些应用,对于提升企业的项...
plm系统主要干什么的   0  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

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

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

内置subversion和git源码管理

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

免费试用