如何用xargs/awk/sed直接执行屏幕输出的每行命令(Win10环境)
问题描述
本人使用Windows10、GNUWIN32和Cygwin64环境。假设屏幕输出内容为:
command1 command2 command3
期望实现的效果是,屏幕上显示的每一行内容都能在显示后立即作为命令被执行。目前本人通过在每行前添加"run.bat"的方式实现,run.bat内容为:
%1 %2 %3 %4 %5 %6 %7 %8 %9
但该临时方案过于繁琐。现询问如何使用xargs(或awk、sed)直接将屏幕输出的每一行作为独立命令,完全按显示内容立即执行,且无需将输出重定向保存到单独批处理文件,也无需为行添加前后缀。
解决方案
Cygwin64 环境
用xargs实现
直接用xargs配合占位符,调用bash先显示再执行命令:
# 替换成你实际输出命令列表的命令 your-output-command | xargs -I {} bash -c 'echo {}; {}'
-I {}表示把每一行的内容替换到{}的位置bash -c 'echo {}; {}'先打印命令内容,紧接着执行这条命令
如果不需要提前显示命令,直接执行的话可以简化:
your-output-command | xargs -I {} bash -c {}
用awk实现
awk的写法更直接,一行搞定显示+执行:
your-output-command | awk '{print $0; system($0)}'
print $0输出当前行的命令内容system($0)调用shell执行这条命令
GNUWIN32 环境
GNUWIN32的工具适配Windows的cmd环境,写法略有不同:
用xargs实现
your-output-command | xargs -I {} cmd /c "echo {} && {}"
cmd /c用来启动cmd执行后面的命令串echo {} && {}先打印命令,再执行
用awk实现
GNUWIN32的awk也支持system函数,不过需要指定用cmd执行:
your-output-command | awk '{print $0; system("cmd /c " $0)}'
内容的提问来源于stack exchange,提问作者George
相关产品推荐
相关产品推荐

