Bash 删除 for 循环中的第一个字符

Bash 删除 for 循环中的第一个字符

我有以下代码片段:

#!/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也会匹配例如字段,其中ptsis 是用户名的一部分。

为了避免这种情况,你可以这样做:

#!/bin/bash
last -n 10 | while read -r line; do
    read -r  user term whatever <<< "$line"
    if [[ $term = *pts* ]]; then
        echo "$line"
    fi
done

相关内容