다음 코드 조각이 있습니다.
#!/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'
"root"와 "Fri"에 있는 것과 "Mon"과 "Jan"에 있는 것이 구분 기호 역할을 하도록 설정 IFS
됩니다 . 백슬래시를 실제 제어 문자 CR 및 LR로 이스케이프하는 ANSI C 인용을 사용하려고 합니다 . 즉, 다음과 같습니다.<backslash><letter r><backslash><letter n>
r
n
$'...'
IFS=$'\r\n'
다음을 사용할 수도 있습니다.
if [[ $entry = *pts* ]]; then...
문자열을 찾고 해당 문자열 및 이 사용자 이름의 일부인 echo | grep
필드와도 일치합니다 .pts
이를 방지하려면 다음을 수행할 수 있습니다.
#!/bin/bash
last -n 10 | while read -r line; do
read -r user term whatever <<< "$line"
if [[ $term = *pts* ]]; then
echo "$line"
fi
done