2012-04-23 130 views
6

我真的是新的bash,但它是学校的主题之一。其中一个练习是:Bash:从命令输出的grep模式

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

假设USERNAME是我自己的登录ID,我能完全做到这样:

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

它只是给了需要的行号(也有可能是一个更优化的方式)。不过,我想知道是否有办法让命令更通用,以便它使用whoami的输出来表示grep模式,而不使用脚本或使用变量来代表。换句话说,以保持一个易于阅读的一个行命令,像这样:

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

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

回答

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

围绕'标记的命令使得执行命令,并输出送入它裹在,在bash手册页

+0

好的,反引号......当然:)谢谢! – MarioDS 2012-04-23 12:55:18

+1

没有锚定,如果您的登录名称与该行其他地方匹配,则可能会产生错误匹配。我以前在本地系统上有一个简短的登录名,它恰好匹配(“系统操作员”的子字符串),所以当我不是时,一些愚蠢的软件认为我是“root”。 – tripleee 2014-11-17 11:58:41

9

检查命令替换命令。

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

因此,对于你的问题:

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

将取代的whoami的输出参数为-e标志grep命令和整个命令的输出将是行号在运行用户的/etc/passwd

+0

+1因为它有效,但Lynn的回答更清晰(至少对像我这样的初学者:))但我喜欢你指出我应该使用grep的-n开关来缩短它。 – MarioDS 2012-04-23 13:01:48

+4

+1,我更喜欢'$()'构造,只是因为它更容易嵌套。 – paxdiablo 2012-04-23 13:11:41

+0

+1为了指出两种语法:) – 2012-04-23 13:19:14

10

您可以用单一awk调用做到这一点:

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

的详细信息:

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

感谢您的很好的解释,但现在它似乎先进我建立这样的命令我自己:) – MarioDS 2012-04-23 13:12:21

+3

@Mario:你越早开始学习,越早你会能够为您的开发服务收取昂贵的费用:-) – paxdiablo 2012-04-23 13:13:30

+0

+1为了向noobie炫耀awk – 2012-04-23 13:19:38