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

2024-10-12 10:28:00
admin
原创
76
摘要:问题描述:我想编写一个脚本,循环遍历 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。

相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   601  
  华为IPD与传统研发模式的8大差异在快速变化的商业环境中,产品研发模式的选择直接决定了企业的市场响应速度和竞争力。华为作为全球领先的通信技术解决方案供应商,其成功在很大程度上得益于对产品研发模式的持续创新。华为引入并深度定制的集成产品开发(IPD)体系,相较于传统的研发模式,展现出了显著的差异和优势。本文将详细探讨华为...
IPD流程是谁发明的   7  
  如何通过IPD流程缩短产品上市时间?在快速变化的市场环境中,产品上市时间成为企业竞争力的关键因素之一。集成产品开发(IPD, Integrated Product Development)作为一种先进的产品研发管理方法,通过其结构化的流程设计和跨部门协作机制,显著缩短了产品上市时间,提高了市场响应速度。本文将深入探讨如...
华为IPD流程   9  
  在项目管理领域,IPD(Integrated Product Development,集成产品开发)流程图是连接创意、设计与市场成功的桥梁。它不仅是一个视觉工具,更是一种战略思维方式的体现,帮助团队高效协同,确保产品按时、按质、按量推向市场。尽管IPD流程图可能初看之下显得错综复杂,但只需掌握几个关键点,你便能轻松驾驭...
IPD开发流程管理   8  
  在项目管理领域,集成产品开发(IPD)流程被视为提升产品上市速度、增强团队协作与创新能力的重要工具。然而,尽管IPD流程拥有诸多优势,其实施过程中仍可能遭遇多种挑战,导致项目失败。本文旨在深入探讨八个常见的IPD流程失败原因,并提出相应的解决方法,以帮助项目管理者规避风险,确保项目成功。缺乏明确的项目目标与战略对齐IP...
IPD流程图   8  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

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

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

内置subversion和git源码管理

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

免费试用