如何将命令输出作为多个参数传递给另一个命令

2024-09-30 13:54:00
admin
原创
240
摘要:问题描述:我想将一个命令的每个输出作为多个参数传递给第二个命令,例如:grep "pattern" input 返回:file1 file2 file3 我想复制这些输出,例如:cp file1 file1.bac cp file2 file2.bac cp file3...

问题描述:

我想将一个命令的每个输出作为多个参数传递给第二个命令,例如:

grep "pattern" input

返回:

file1
file2
file3

我想复制这些输出,例如:

cp file1  file1.bac
cp file2  file2.bac
cp file3  file3.bac

我怎样才能一次性完成这一切?例如:

grep "pattern" input | cp $1  $1.bac

解决方案 1:

您可以使用xargs

grep 'pattern' input | xargs -I% cp "%" "%.bac"

解决方案 2:

您可以使用$()来插入命令的输出。因此,kill -9 $(grep -hP '^d+$' $(ls -lad /dir/*/pid | grep -P '/dir/d+/pid' | awk '{ print $9 }'))如果您愿意,您可以使用。

解决方案 3:

为了完整起见,我还将提到命令替换并解释为什么不推荐这样做:

cp $(grep -l "pattern" input) directory/

(反引号语法cp grep -l "pattern" input directory/大致相同,但是它已经过时并且难以使用;不要使用它。)

grep如果输出的文件名包含空格或 shell 元字符,则此操作将失败。

当然,如果您确切知道grep可以生成哪些文件名,并且已验证它们都没有问题,那么使用这个是可以的。但对于生产脚本,请不要使用它。

无论如何,对于 OP 的情况,您需要单独参考每场比赛并添加扩展,无论如何xargs,或while read替代方案都是更好的。

在最坏的情况下(意味着有问题或未指定的文件名),通过以下方式将匹配项传递给子 shell xargs

grep -l "pattern" input |
xargs -r sh -c 'for f; do cp "$f" "$f.bac"; done' _

...显然循环内的脚本for可以任意复杂。

理想情况下,您要运行的命令足够简单(或通用),您可以简单地向其传递任意长的文件名列表。例如,GNUcp有一个-t选项可以方便地使用xargs(该-t选项允许您将目标目录放在命令行的首位,因此您可以在命令末尾放置任意数量的文件):

grep -l "pattern" input | xargs cp -t destdir

将扩展为

cp -t destdir file1 file2 file3 file4 ...

xargs查找命令行中可以容纳的尽可能多的匹配项cp,重复传递所有文件到 所需的次数cp。(不幸的是,这与 OP 的情况不符;如果您需要在复制时重命名每个文件,则每次调用时只需传入两个参数cp:源文件名和要复制到的目标文件名。)

换句话说,如果您使用命令替换语法并grep生成一个非常长的匹配列表,则可能会遇到ARG_MAX“参数列表太长”错误;但xargs可以通过只复制一次可以安全传递的参数数量来特别避免这种情况cp,并在必要时运行cp多次。

如果文件名包含换行符,上述操作仍然无法正常工作。或许还可以参阅<https://mywiki.wooledge.org/BashFAQ/020>

解决方案 4:

除了Chris Jester-Young 的好答案之外,我想说这xargs对于这些情况也是一个很好的解决方案:

grep ... `ls -lad ... | awk &#039;{ print $9 }&#039;` | xargs kill -9

会成功的。总而言之:

grep -hP &#039;^d+$&#039; `ls -lad /dir/*/pid | grep -P &#039;/dir/d+/pid&#039; | awk &#039;{ print $9 }&#039;` | xargs kill -9

解决方案 5:

#!/bin/bash

for f in files; do
  if grep -q PATTERN &quot;$f&quot;; then
    echo cp -v &quot;$f&quot; &quot;${f}.bac&quot;
  fi
done

文件可以是 .txt 或 .text,这基本上意味着文件以 .txt 或 text 结尾,或者用您想要/需要的内容替换,当然用您的替换 PATTERN。如果您对输出满意,请删除 echo。对于递归解决方案,请查看 bash shell 选项globstar

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   2482  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1533  
  PLM(产品生命周期管理)项目对于企业优化产品研发流程、提升产品质量以及增强市场竞争力具有至关重要的意义。然而,在项目推进过程中,范围蔓延是一个常见且棘手的问题,它可能导致项目进度延迟、成本超支以及质量下降等一系列不良后果。因此,有效避免PLM项目范围蔓延成为项目成功的关键因素之一。以下将详细阐述三大管控策略,助力企业...
plm系统   0  
  PLM(产品生命周期管理)项目管理在企业产品研发与管理过程中扮演着至关重要的角色。随着市场竞争的加剧和产品复杂度的提升,PLM项目面临着诸多风险。准确量化风险优先级并采取有效措施应对,是确保项目成功的关键。五维评估矩阵作为一种有效的风险评估工具,能帮助项目管理者全面、系统地评估风险,为决策提供有力支持。五维评估矩阵概述...
免费plm软件   0  
  引言PLM(产品生命周期管理)开发流程对于企业产品的全生命周期管控至关重要。它涵盖了从产品概念设计到退役的各个阶段,直接影响着产品质量、开发周期以及企业的市场竞争力。在当今快速发展的科技环境下,客户对产品质量的要求日益提高,市场竞争也愈发激烈,这就使得优化PLM开发流程成为企业的必然选择。缺陷管理工具和六西格玛方法作为...
plm产品全生命周期管理   0  
热门文章
项目管理软件有哪些?
曾咪二维码

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

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

云端的项目管理软件

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

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

内置subversion和git源码管理

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

免费试用