26

我对 bash 很陌生,但它是学校的科目之一。其中一项练习是:

给出您自己的登录信息所在的文件“/etc/passwd”的行号。

假设USERNAME是我自己的登录 ID,我可以通过这种方式完美地做到这一点:

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

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

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

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

4

3 回答 3

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

将命令括在 ` 标记中使其执行命令并将输出发送到包含它的命令中。

于 2012-04-23T12:54:22.363 回答
14

您可以通过一次awk调用来做到这一点:

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

更详细地说:

  • -v创建一个名为的awk变量me并用您的用户名填充它。
  • -F字段分隔符设置:为适合密码文件。
  • $1==me唯一选择第一个字段与您的用户名匹配的行。
  • print输出记录号(行)。
于 2012-04-23T13:03:12.837 回答
11

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

你可以反勾号``$(),我个人更喜欢后者。

所以对于你的问题:

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

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

于 2012-04-23T12:58:04.343 回答