来自行尾的grep的正则表达式

时间:2017-01-11 01:46:05

标签: regex

表示/ etc / passwd中的一行

我想从行尾($)grep到第一个":"从最后一行开始。

例如,\ n johndoe:x:39:39:John Doe:/ var / lib / canna:/ sbin / nologin

我想grep" / sbin / nologin"

我的grep命令使用的正确的正则表达式是什么?

2 个答案:

答案 0 :(得分:1)

如果您不介意选择冒号,请使用:

grep -o -e ':[^:]*$' /etc/passwd

选择一个不跟随任何其他冒号的冒号,然后选择行尾,只打印匹配的冒号。

如果您不想要冒号并且确实启用了PCRE grep,请查看Regex lookahead for 'not followed by' in grep?;你需要调整它来做后视而不是前瞻,这就是全部。

如果您没有grep -o,请使用sed代替(省略冒号):

sed -n -e '/.*:\([^:]*\)$/ s//\1/p' /etc/passwd

这可能是最便携的解决方案。

(在macOS Sierra和Mac OS X上,/etc/passwd文件的顶部有注释行,以#开头。sed命令不会打印这些行,因为它们不会#39;它们上面有任何冒号。因此,它可以在Mac以及Linux和Unix的其他变体上干净利用。它不使用sed的高级(又称非便携式)功能。)

答案 1 :(得分:1)

如何使用cut,这更直接:

echo 'johndoe:x:39:39:John Doe:/var/lib/canna:/sbin/nologin' | cut -d ':' -f 7