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

时间:2012-04-23 12:52:48

标签: bash unix grep pipe

我真的很喜欢bash,但它是学校的主题之一。其中一个练习是:

提供文件的行号" / etc / passwd"有关您自己登录信息的地方。

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

 cat /etc/passwd -n | grep USERNAME | cut -f1

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

 cat /etc/passwd -n | grep (whoami) | cut -f1

很抱歉,如果这是一个非常棒的问题。

3 个答案:

答案 0 :(得分:20)

cat /etc/passwd -n | grep `whoami` | cut -f1 

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

答案 1 :(得分:11)

您可以使用单个awk调用执行此操作:

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

更详细:

  • -v创建一个名为awk的{​​{1}}变量,并使用您的用户名填充它。
  • me将字段分隔符设置为-F,以适应密码文件。
  • :仅选择第一个字段与您的用户名匹配的行。
  • $1==me输出记录编号(行)。

答案 2 :(得分:9)

bash手册页中检查命令替换。

你可以回复``$(),我个人更喜欢后者。

所以对于你的问题:

grep -n -e $(whoami) /etc/passwd | cut -f1 -d :

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