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.

"문제"에 대해 grep을 사용해 보았지만 'd'의 첫 번째 줄만 인쇄됩니다. 내가 얻은 결과는 다음과 같습니다.

1  ok device issue   Some Action which 

그러나 나는 d의 완전한 출력을 원합니다. csv로 파일을 저장하려고 하면 d 열의 두 번째 줄이 새 줄로 표시되었습니다.

편집하다:

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

답변1

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

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

답변2

grep기본 모드에서와 같이 작동합니다. 해당 페이지에서 man:

...grep은 각 파일에서 PATTERNS를 검색합니다. PATTERNS는 개행 문자로 구분된 하나 이상의 패턴이며 grep은 패턴과 일치하는 각 줄을 인쇄합니다.

그럼, 나올 것 같은데.윤곽a와 일치하는 텍스트에서 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.

관련 정보