텍스트 파일에서 문자열을 찾아 결과에 따라 스크립트를 실행합니다.

텍스트 파일에서 문자열을 찾아 결과에 따라 스크립트를 실행합니다.

다음 내용이 포함된 파일(Data.txt)이 있습니다.

A=1234597890 B=192.168.1.1

B가 먼저 가는 경우도 있고, A나 B만 가는 경우도 있습니다.

그래서 내가 찾은 경우 :

  A,    Print A content and execute A script
  B,     "    B    "     "    "     B   "
 A&B,    "   A&B   "     "    "     A   "
Neither, Print a error message

이제 문제는 A와 B의 내용이 항상 다르다는 것입니다!

어떤 명령을 사용하는 것이 가장 좋은지 모르겠습니다.

도와주셔서 감사하고 제 기본 영어를 이해하려고 노력해 주셔서 감사합니다 :)!

답변1

Perl에서는 다음과 같이 할 수 있습니다.

$ perl -lne 'if(/A=([^\s]+)/){print "A : $1"; `scriptA.sh`} 
           if(/B=([^\s]+)/){print "B : $1"; `scriptB.sh`}' Data.txt

설명하다

  • -lneprint: 각 입력 줄에서 후행 줄 바꿈을 제거하고 각 호출에 줄 바꿈을 추가합니다( -l). 파일을 한 줄씩 읽고( ) -n각 줄에 제공된 스크립트를 실행합니다.-e
  • if(/A=([^\s]+)/){print "A : $1"; `scriptA.sh`}: 이 줄이 일치하는 A=항목이 있으면 인쇄하고 A : something(대괄호는 패턴이 캡처되어 이제 로 저장되었음을 나타냄 $1) 를 실행합니다 scriptA.
  • if(/B=([^\s]+)/){print "B : $1"; `scriptB.sh`}: 위와 같지만 B의 경우입니다.

또는 값을 추출하여 구문 분석할 수 있습니다.

$ grep -Po '[AB]=[^\s]+' Data.txt | 
    while IFS="=" read name val; do 
        echo "$name=$val"; 
        [ "$name" = "A" ] && scriptA.sh || scriptB.sh; 
    done

설명하다

  • grep -Po '[AB]=[^\s]+' Data.txt: -P할 수 있게 하다PCRE, 그리고 각 일치 항목이 다른 줄에 인쇄되도록 -o합니다 . "A 또는 B와 일치하고 그 다음 공백이 아닌 문자를 최대한 많이 일치시키는 것을 grep의미합니다 . 출력은 각각 한 줄에 있는 입력 파일의 전체 세트입니다 .[AB]=[^\s]+=A=fooB=bar
  • while IFS="=" read name val: 이온 입력 필드 구분자를 설정 =하고 두 개의 변수를 읽습니다. 이는 그들과 관련된 가치 가 $name될 것임을 의미 합니다.AB$value
  • echo "$name=$val";:원하는 대로 형식을 변경하여 인쇄하세요.
  • [ "$name" = "A" ] && scriptA.sh || scriptB.sh;: $name그렇다면 A실행하고 scriptA.sh, 그렇지 않으면 실행합니다 scriptB.sh. 위의 두 솔루션 모두 호출하려는 스크립트가 $PATH에 있다고 가정 scriptA.sh합니다 scriptB.sh. 적절하게 편집하십시오.

관련 정보