因此我有一个用户名列表,例如:
user1
user2
user3
我想id
对它们每一个都应用并得到类似的结果:
uid=100(user1) gid=5(g1) groups=5(g1),6(g6),7(g10)
.
.
我该如何实现呢?请注意,列表是另一个命令 say 的输出mycommand
。
答案1
使用xargs
:
mycommand | xargs -L1 id
例子:
$ (echo root; echo nobody) | xargs -L1 id
uid=0(root) gid=0(root) groups=0(root)
uid=65534(nobody) gid=65534(nogroup) groups=65534(nogroup)
您还可以在 bash 中循环输入:
mycommand | while read line
do
id "$line"
done
xargs
将输入转换为命令的参数。该-L1
选项指示xargs
将每一行用作命令调用的唯一参数。
答案2
使用 bash,你可以将输出行捕获到一个数组中:
mapfile -t lines < <(mycommand)
然后迭代它们
for line in "${lines[@]}"; do
id "$line"
done
这不像 xargs 那样简洁,但如果您需要多行内容,它就非常有用。
答案3
tar -czf reloads.stage.tgz $(find . | egrep "sh$|functions$|sql$|setup$")
首先我进行了测试find/egrep
以确保我获得了我想要的列表,然后我将它作为文件列表添加到命令末尾tar
。
希望这会有所帮助。
find .
只是查找当前目录下的所有文件,但是您可以根据需要指定子目录或完全不同的路径。egrep
只允许grep
使用竖线 (|
) 分隔多个搜索字符串。- 此后,其余的事情就都说得通了。