问题
I'm really new with bash, but it's one of the subjects on school. One of the exercises was:
Give the line number of the file "/etc/passwd" where the information about your own login is.
Suppose USERNAME
is my own login ID, I was able to do it perfectly in this way:
cat /etc/passwd -n | grep USERNAME | cut -f1
Which simply gave the line number required (there may be a more optimised way). I wondered however, if there was a way to make the command more general so that it uses the output of whoami
to represent the grep pattern, without scripting or using a variable. In other words, to keep it an easy-to-read one-line command, like so:
cat /etc/passwd -n | grep (whoami) | cut -f1
Sorry if this is a really noob question.
回答1:
cat /etc/passwd -n | grep `whoami` | cut -f1
Surrounding a command in ` marks makes it execute the command and send the output into the command it's wrapped in.
回答2:
You can do this with a single awk
invocation:
awk -v me=$(whoami) -F: '$1==me{print NR}' /etc/passwd
In more detail:
- the
-v
creates anawk
variable calledme
and populates it with your user name. - the
-F
sets the field separator to:
as befits the password file. - the
$1==me
only selects lines where the first field matches your user name. - the
print
outputs the record number (line).
回答3:
Check command substitution in the bash
man page.
You can you back ticks ``
or $()
, and personally I prefer the latter.
So for your question:
grep -n -e $(whoami) /etc/passwd | cut -f1 -d :
will substitute the output of whoami
as the argument for the -e
flag of the grep
command and the output of the whole command will be line number in /etc/passwd
of the running user.
来源:https://stackoverflow.com/questions/10280941/bash-grep-pattern-from-command-output