假设我从命令(例如ls -1
)获得了一些输出:
a
b
c
d
e
...
我想echo
依次对每个命令应用一个命令(例如)。例如
echo a
echo b
echo c
echo d
echo e
...
在bash中最简单的方法是什么?
假设我从命令(例如ls -1
)获得了一些输出:
a
b
c
d
e
...
我想echo
依次对每个命令应用一个命令(例如)。例如
echo a
echo b
echo c
echo d
echo e
...
在bash中最简单的方法是什么?
Answers:
这可能是最容易使用的xargs
。在您的情况下:
ls -1 | xargs -L1 echo
该-L
标志确保正确读取输入。从手册页xargs
:
-L number
Call utility for every number non-empty lines read.
A line ending with a space continues to the next non-empty line. [...]
ls
自动-1
在管道中进行。
ls | xargs -L2 echo
并ls -1 | xargs -L2 echo
给出两个不同的输出。前者全都在一条线上。
xargs
只能运行可执行文件,而不能运行Shell函数或Shell内置命令。对于前者,最好的解决方案可能是一个read
循环的解决方案。
-L1
其用途。
您可以在每行上使用基本的前置操作:
ls -1 | while read line ; do echo $line ; done
或者,您可以将输出通过管道传递给sed以进行更复杂的操作:
ls -1 | sed 's/^\(.*\)$/echo \1/'
sh: cho: not found a sh: cho: not found
将e
in echo作为sed命令之类。
while
循环。cmd1 | while read line; do cmd2 $line; done
。还是while read line; do cmd2 $line; done < <(cmd1)
不创建子shell。这是sed
命令的简化版本:sed 's/.*/echo &/'
"$line"
在while循环中加引号,以避免单词分裂。
read -r line
以防止read
被转义字符弄乱。例如echo '"a \"nested\" quote"' | while read line; do echo "$line"; done
Gives "a "nested" quote"
,它已经逃脱了。如果我们做到了,echo '"a \"nested\" quote"' | while read -r line; do echo "$line"; done
我们将"a \"nested\" quote"
如期实现。参见wiki.bash-hackers.org/commands/builtin/read
printf '%s\0' * | xargs -0 ...
-否则,它是用空格,报价等文件名非常不安全
只要是GNU sed,您实际上就可以使用sed来做。
... | sed 's/match/command \0/e'
这个怎么运作:
cat /logs/lfa/Modified.trace.log.20150904.pw | sed -r 's/^(.*)(\|006\|00032\|)(.*)$/echo "\1\2\3 - ID `shuf -i 999-14999 -n 1`"/e'
for s in `cmd`; do echo $s; done
如果cmd具有较大的输出:
cmd | xargs -L1 echo
cmd
输出中有空格,则第一个将失败。
xargs失败,并带有反斜杠,引号。它必须像
ls -1 |tr \\n \\0 |xargs -0 -iTHIS echo "THIS is a file."
xargs -0选项:
-0, --null Input items are terminated by a null character instead of by whitespace, and the quotes and backslash are not special (every character is taken literally). Disables the end of file string, which is treated like any other argument. Useful when input items might contain white space, quote marks, or backslashes. The GNU find -print0 option produces input suitable for this mode.
ls -1
用换行符终止项目,因此tr
将其转换为空字符。
这种方法比手动迭代要慢大约50倍for ...
(请参阅Michael Aaron Safyan的回答)(3.55s vs.0.066s)。但是对于其他输入命令,例如定位,查找,从文件(tr \\n \\0 <file
)或类似文件中读取,则必须xargs
像这样使用。
对我来说更好的结果:
ls -1 | xargs -L1 -d "\n" CMD
find . -mindepth 1 -maxdepth 1 -print0 | xargs -0 command
将处理的输出ls -1
模棱两可的情况;使用-printf '%P\0'
而不是-print0
如果您不希望./
每个人都领先。
ls -1
可能是这里的一个例子,但重要的是要记住,解析输出不好ls
。参见:mywiki.wooledge.org/ParsingLs