스크립트가 텍스트 파일을 읽을 때 특정 변수에서 특정 문자열이 발견되면 이 코드가 특정 명령을 실행하도록 하고 싶습니다.
예:
다음 코드를 사용하여 명령의 출력을 읽고 싶다고 가정해 보겠습니다 last
.
#!/bin/bash
for i in `last`; do
sleep 0.1 | echo -ne "$i "
done
이 명령의 출력은 last
다음과 유사한 항목 목록 형식의 테이블입니다.
username pts/2 1.2.3.4 via Sun Sep 2 06:40 - 06:40 (00:00)
. . . .
. . . .
i
위 코드의 변수는 위 표의 어떤 문구라도 될 수 있습니다. 다음과 같은 특정 명령을 적용하고 싶습니다.새 줄을 시작하다i
변수에i
닫는 괄호가 포함된 경우와 같이 변수에서 특정 문자열을 찾을 때)
코드가 새 줄을 시작하도록 하고 싶습니다 .코드가 명령 출력 읽기를 마치면
last
코드를 반복하고 싶습니다.~을 위한새로운 업데이트가 있는지 읽으려면 다시(여러 번) 반복하세요. 코드가 다시 실행되도록 어떻게 지시합니까? 예를 들어,goto
코드를 특정 줄로 이동시키는 명령이 있나요 ?
조언 좀 부탁드려도 될까요?
답변1
출력이 last
다음과 같은 경우:
username pts/2 1.2.3.4 via Sun Sep 2 06:40 - 06:40 (00:00)
원래 위치에 개행 문자를 추가하려는 경우 논리를 약간 변경하는 것이 좋습니다. 먼저 입력을 한 줄씩 읽은 다음 줄을 단어로 분할합니다. 이렇게 하면 명시적으로 괄호를 찾을 필요가 없습니다. 로 래핑하여 전체 주기를 반복할 수 있습니다 while true; do ... done
. 그래서 우리는 다음과 같은 것을 가지고 있습니다:
#!/bin/bash
set -f
while true; do
last | while IFS= read -r line; do
for word in $line; do
sleep .1
printf "%s " "$word"
done
echo # prints a newline
done
done
set -f
따옴표가 없는 확장으로 인해 발생할 수 있는 파일 이름 확장을 비활성화합니다 $line
. 또한 printf
여러 가지 이유로 단어를 인쇄하기 위해 echo 대신 echo를 사용합니다.
닫는 괄호를 정말로 찾고 싶다면 이 [[ .. ]]
테스트를 사용할 수 있습니다. 이 테스트를 사용하면 glob 유사 패턴이나 정규 표현식에 대한 패턴 일치를 허용합니다. ( [[ $word =~ $re ]]
정규식 일치가 됩니다)
#!/bin/bash
set -f
while true; do
for word in $(last); do
sleep .1
printf "%s " "$word"
[[ $word = *')'* ]] && echo
done
done
물론 이 줄은 최종 로그인 기간이 다음과 같은 것으로 대체되는 줄에 개행 문자를 추가하지 않습니다 still logged in
.
이 for word in $whatever
구조의 단점은 여러 공백을 단일 공백처럼 처리하므로 스크립트 출력에서 열이 원본처럼 깔끔하게 정렬되지 않는다는 것입니다.
답변2
if .. then
다음과 유사한 문을 사용할 수 있습니다 .
#!/bin/bash
for i in `last`; do
sleep 0.1 | echo -ne "$i "
if [[ $i = *')'* ]] ; then
echo "" ;
fi
done
for loop
bash에서 명령(예제에서는 명령)의 출력을 반복적으로 읽으 려면 last
에서 스크립트를 예약해야 합니다 crontab
.여기.
답변3
취할 수 있는 접근 방식은 다양하며, 요구 사항을 설명해야 합니다(특정 사람의 로그인 식별, 특정 시간에 로그인한 사람 식별 등).
당신이 말했듯이 (끝에 뭔가가 나타나면 줄 바꿈을 추가하십시오) 이미 다른 방법이 있습니다.
#finding if a 'last' line contains a "specific_thing" (which is itself a regular expression...)
# and can print all lines or not depending on showall value
while true ; do
last | awk -v looking_for="specific_thing" -v showall=0 '
( showall == 1 ) { print $0 }
( $0 ~ looking_for ) { action="print line? and add something to it?" }
'
done
#watch for new things appearing in last and not the whole "last" output every time
watch last | awk -v looking_for="specific_thing" -v showall=0 '
( showall == 1 ) { print $0 }
( $0 ~ looking_for ) { action="print the line? with added infos?"
action="execute : system(some command) ?"
action="all of that?" }
'
등.
로그 파일에서 고스트를 찾을 수도 있습니다.
/etc/profile에 몇 가지 명령을 삽입할 수도 있습니다. (이는 많은 보안 위험을 야기할 수 있으며 부팅, 초기 부팅 등에서 문제를 일으킬 수도 있습니다. 이는 여러 가지 로그인 문제를 일으킬 수 있는 추악한 해킹입니다. (또는 모든) 사용자는 어떤 경우에도 로그인 사용자가 Ctrl-C를 빠르게 눌러 우회할 수 있습니다...)
등. 갈 수 있는 방법은 여러 가지가 있습니다. 가장 좋은 것은 해야 할 일을 수정하는 것입니다. 이제 "마지막"을 고수하고 "뭔가가 보이면 줄 바꿈을 추가하십시오"
더 나은 답변을 얻으려면 어떻게 해야 한다고 생각하는지보다는 실제로 필요한 것이 무엇인지, 왜 필요한지 알려주십시오. (마지막 출력을 볼 때 줄 바꿈을 추가하십시오. 왜 필요하다고 생각하십니까? 이것에 대한 근본적인 필요성은 무엇입니까?)