Bash 스크립팅 도움말 - 텍스트 구문 분석 및 출력

Bash 스크립팅 도움말 - 텍스트 구문 분석 및 출력

다음과 같은 유형의 텍스트 파일이 있습니다.

a  b   c               d
-- -- --              --
1  ok device issue   Some Action which 
                     has to be taken which 
                     is split into many lines
                     under d.

"문제"에 대해 greping을 시도했지만 "d"의 첫 번째 줄만 인쇄되었습니다. 내가 얻는 결과는 다음과 같습니다.

1  ok device issue   Some Action which 

하지만 나는 d의 완전한 출력을 원합니다. 파일을 csv로 저장하려고 하면 d열의 두 번째 행이 새 행으로 표시됩니다.

편집하다:

문제가 있는 장치를 찾는 변수에 저장된 여러 장치에서 출력을 얻습니다.

답변1

여기에는 여러 줄의 grep이 필요합니다. 이를 위해서는 PCRE 옵션을 활성화해야 합니다 -P . grep은 -zslurp 모드에서 Null로 구분된 레코드를 출력하므로 tr 명령을 통해 이러한 레코드를 삭제합니다.

$ < file grep -Pzo '.*\S.*issue.*\n(?:\h+.*\n)+'  | tr -d '\0'

답변2

grep기본 모드에서 정상적으로 작동합니다. 해당 페이지에서 man:

...grep은 각 파일에서 패턴을 검색합니다. PATTERNS는 줄 바꿈으로 구분된 하나 이상의 패턴이며, grep은 패턴과 일치하는 각 줄을 인쇄합니다.

그러니 나타나야지철사. regex​행은 newline현재 보고 있는 동작을 설명하는 제어 코드로 구분됩니다. -z답변에 언급된 옵션을 사용하는 것 외에도 . "문제"가 일치하려는 정규식이고( 'Device Degraded'또는 '\sDegraded'또는 실제로 일치하려는 경우 대체) '\sError'"수정 조치" 열이 기계에서 생성되고 일관성이 있다고 가정합니다. 즉, 항상 4줄에 걸쳐 있습니다. 이는 다음과 같이 grep -A 3 '\sissue' > issues저장할 수 있습니다. 단순히 달리는 중관심 있는 노선만파일로. 다음과 같은 출력을 생성할 수 있어야 합니다.

1  ok device issue  Some Action which 
                        has to be taken which 
                        is split into many lines 
                        under d.
--
10  ok device issue Some Action which
            has to be taken which 
            is split into may lines
            under d. 
--
211 ok device issue Some Action which
            has to be taken which 
            is split into many lines 
            under d.

이러한 옵션에 대해 자세히 알아보려면 grep의 매뉴얼 페이지를 확인하세요.

답변3

입력 파일의 "레코드"가 OP에서 제공한 것과 정확히 동일하다고 가정합니다.

$ sed '/issue/!d; :a; n; /^[0-9]\{1,\} /d; $!ba' file
1  ok device issue   Some Action which 
                     has to be taken which 
                     is split into many lines
                     under d.
$

답변4

이것은 아마도 모든 UNIX 시스템의 모든 쉘에서 awk를 사용하여 원하는 것일 것입니다.

$ cat tst.awk
/^[0-9]/ { prt() }
{ rec = rec $0 ORS }
END { prt() }

function prt() {
    if ( rec ~ regexp ) {
        printf "%s", rec
    }
    rec = ""
}

.

$ awk -v regexp='issue' -f tst.awk file
1  ok device issue   Some Action which
                     has to be taken which
                     is split into many lines
                     under d.

관련 정보