Bash:来自命令输出的grep模式

Mar*_*oDS 14 unix bash grep pipe

我真的很喜欢bash,但这是学校的主题之一.其中一项练习是:

给出文件"/ etc/passwd"的行号,其中有关您自己的登录信息.

假设USERNAME是我自己的登录ID,我能够以这种方式完美地完成它:

 cat /etc/passwd -n | grep USERNAME | cut -f1
Run Code Online (Sandbox Code Playgroud)

这只是简单地给出了所需的行号(可能有更优化的方式).然而,我想知道,如果有一种方法可以使命令更通用,那么它使用输出whoami来表示grep模式,而无需编写脚本或使用变量.换句话说,要保持它易于阅读的单行命令,如下所示:

 cat /etc/passwd -n | grep (whoami) | cut -f1
Run Code Online (Sandbox Code Playgroud)

对不起,如果这是一个真正的菜鸟问题.

Lyn*_*ing 23

cat /etc/passwd -n | grep `whoami` | cut -f1 
Run Code Online (Sandbox Code Playgroud)

在`标记中包含一个命令使它执行命令并将输出发送到它所包含的命令中.


pax*_*blo 11

您可以通过一次awk调用来完成此操作:

awk -v me=$(whoami) -F: '$1==me{print NR}' /etc/passwd
Run Code Online (Sandbox Code Playgroud)

更详细:

  • -v创建一个awk名为变量me,并与您的用户名填充它.
  • -F套字段分隔符:为应景密码文件.
  • $1==me只选择第一个字段匹配您的用户名线.
  • print输出的记录数(线).

  • @Mario:越早开始学习,越早能够为开发服务收取过高的费用:-) (4认同)

Chi*_*rat 9

检查bash手册页中的命令替换.

你可以支持蜱虫,``或者$()我个人更喜欢后者.

所以对于你的问题:

grep -n -e $(whoami) /etc/passwd | cut -f1 -d :
Run Code Online (Sandbox Code Playgroud)

将输出替换whoami为命令-e标志的参数,grep整个命令的输出将是/etc/passwd正在运行的用户的行号.

  • +1,我更喜欢`$()`结构,因为它更容易嵌套. (4认同)