단어의 특정 문자열을 읽을 때 명령을 실행합니다(예: 새 줄 시작).

단어의 특정 문자열을 읽을 때 명령을 실행합니다(예: 새 줄 시작).

스크립트가 텍스트 파일을 읽을 때 특정 변수에서 특정 문자열이 발견되면 이 코드가 특정 명령을 실행하도록 하고 싶습니다.

예:

다음 코드를 사용하여 명령의 출력을 읽고 싶다고 가정해 보겠습니다 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)
. . . . 
. . . . 
  1. i위 코드의 변수는 위 표의 어떤 문구라도 될 수 있습니다. 다음과 같은 특정 명령을 적용하고 싶습니다.새 줄을 시작하다i변수에 i닫는 괄호가 포함된 경우와 같이 변수에서 특정 문자열을 찾을 때 )코드가 새 줄을 시작하도록 하고 싶습니다 .

  2. 코드가 명령 출력 읽기를 마치면 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 loopbash에서 명령(예제에서는 명령)의 출력을 반복적으로 읽으 려면 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를 빠르게 눌러 우회할 수 있습니다...)

등. 갈 수 있는 방법은 여러 가지가 있습니다. 가장 좋은 것은 해야 할 일을 수정하는 것입니다. 이제 "마지막"을 고수하고 "뭔가가 보이면 줄 바꿈을 추가하십시오"

더 나은 답변을 얻으려면 어떻게 해야 한다고 생각하는지보다는 실제로 필요한 것이 무엇인지, 왜 필요한지 알려주십시오. (마지막 출력을 볼 때 줄 바꿈을 추가하십시오. 왜 필요하다고 생각하십니까? 이것에 대한 근본적인 필요성은 무엇입니까?)

관련 정보