我有以下代码片段:
#!/bin/bash
IFS='\r\n'
vconsole="pts"
for entry in $(last -n 10)
do
if [ -z $entry ]
then
continue
fi
if [ "$( echo $entry | grep -o 'pts')" == "$vconsole" ]
then
echo $entry
fi
done
如果我执行它,我会得到:
oot pts/0 85.XXX.XXX.138 F
oot pts/0 85.XXX.XXX.138 Mo
oot pts/1 85.XXX.XXX.138 Tue Ja
oot pts/0 85.XXX.XXX.138 Tue Ja
我期待这样的事情:
root pts/0 85.XXX.XXX.138 Fri Jan 15 11:19 still logged in
root pts/0 85.XXX.XXX.138 Mon Jan 11 10:12 - 10:43 (00:31)
root pts/1 85.XXX.XXX.138 Tue Jan 5 14:30 - 14:39 (00:08)
root pts/0 85.XXX.XXX.138 Tue Jan 5 13:29 - 14:39 (01:10)
为什么第一个角色被删掉了?另外,为什么结尾看起来是随机的?
我正在运行这个centos-release-7-9.2009.1.el7.centos.x86_64
答案1
IFS='\r\n'
这设置IFS
为<backslash><letter r><backslash><letter n>
,因此r
“root”和“Fri”中的 以及n
“Mon”和“Jan”中的 充当分隔符。您打算使用 ANSI C 引用 ,$'...'
它将反斜杠转义为实际的控制字符 CR 和 LR,即:
IFS=$'\r\n'
请注意,您还可以使用
if [[ $entry = *pts* ]]; then...
查找字符串,但该字符串和 theecho | grep
也会匹配例如字段,其中pts
is 是用户名的一部分。
为了避免这种情况,你可以这样做:
#!/bin/bash
last -n 10 | while read -r line; do
read -r user term whatever <<< "$line"
if [[ $term = *pts* ]]; then
echo "$line"
fi
done