我正在尝试使以" ab"开头的用户或以" 1"结尾。只有用户。以下命令与谁一起使用,但由于某种原因而不是用户。
users | grep -e "^ab" -e "1$"
结果是我让系统的所有用户
users
在A single 行上输出登录的用户。如果您想分别与grep
匹配,请首先将输出从users
分为单个行,通过用newline替换每个空间:
users | tr ' ' 'n' | grep -e "^ab" -e "1$"
更新:另外,如果使用GREP的-o
选项,则可以跳过tr
步骤 word 边界(如果" ab"one_answers" 1"本身不应匹配,则将*
替换为CC_7):
users | grep -o -e 'babw*' -e 'bw*1'
( OSX 用户:令人难以置信的是,有时会跳过匹配 - 在10.9上使用输入字符串"ab 1 abc x1"
在10.9上观察到;您可以通过将Regexes组合到单个中并使用egrep
或grep -E
或CC_11:<<<<p>。/p>
users | egrep -o 'b(abw*|w*1)'
)
users
的输出在一行上一起运行。
who
的输出分配,每行一条,有其他详细信息。
您对^
和$
的使用仅与行的起点或结尾匹配。
who | grep -e '^ab' -e '1$'
…说要匹配其名称以" ab"开头或终端登录的用户(或其他字段,取决于您的who
版本,可能是时间)以1
结束,由于登录终端是who
中的最后一个字段。
要匹配who
中的用户名,您可以cut
输出到空间上的字段,然后使用第一个字段:
who | cut -d ' ' -f 1 | grep -e '^ab' -e '1$'
要匹配users
的输出,您不能使用行标记的开始和结尾^…$
,但是可以使用b
users | grep -e 'bab' -e '1b'
如果您要以序列提取匹配名称:
users | grep -o -e 'babw*b' -e 'bw*1b'
如果您需要提取用户列表(在空间上拆分)并测试每个用户,例如要执行一些操作,您可以使用read
:
users | while read -d ' ' user
do
if echo $user | grep -q -e '^ab' -e '1$'
then
echo "you have a nice name" | write $user
fi
done
@mklement在评论中指出,Bash也有自己的内置正则匹配:
users | while read -d ' ' user
do
if [[ $user =~ '^ab|1$' ]]
then
echo "this is a little nicer way to match, $user" | write $user
fi
done