7

So I have a list of usernames such as:

user1
user2
user3

I want to apply id on each of them and get something like:

uid=100(user1) gid=5(g1) groups=5(g1),6(g6),7(g10)
.
.

How can I achieve this? Please note that the list is the output of another command say mycommand.

  • What input does mycommand expect? Or ismycommand a script of yours and you are asking how to give it the list of usernames as the input? Please edit and clarify. – dessert Dec 18 '17 at 8:23
  • it's a script of mine that gives that list as output – yukashima huksay Dec 18 '17 at 8:27
15

Use xargs:

mycommand | xargs -L1 id

Example:

$ (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)

You can also loop over the input in bash:

mycommand | while read line
do
    id "$line"
done

xargs converts input to arguments of a command. The -L1 option tells xargs to use each line as a sole argument to an invocation of the command.

  • 2
    If I know it is newline separated, and there is some danger that the input stream might contain spaces, I use '-d\n', as is: mycommand | xargs '-d\n' -L1 id Pretty much always a good idea, along with proper "$quoting" of all shell variables. – Seth Robertson Dec 18 '17 at 17:34
  • @SethRobertson very true. I left off the -d '\n' and IFS= read -r since the input is said to be usernames, I felt it might be overkill. – Olorin Dec 19 '17 at 1:01
4

With bash, you can capture the lines of output into an array:

mapfile -t lines < <(mycommand)

And then iterate over them

for line in "${lines[@]}"; do
    id "$line"
done

This is not as concise as xargs, but if you need the lines for more than one thing, it's pretty useful.

  • what does ` < <` mean? – yukashima huksay Dec 18 '17 at 11:39
  • 1
    The first < is the usual redirection of mapfile's stdin. <(...) is a process substitution -- process substitutions are very useful to avoid issues due to pipelines running in subshells. – glenn jackman Dec 18 '17 at 14:12

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.