Bash에서 보고서 유형 데이터를 분석하는 방법은 무엇입니까?

Bash에서 보고서 유형 데이터를 분석하는 방법은 무엇입니까?

Bash에서 다음 데이터를 읽는 가장 좋은 방법은 무엇입니까? 예를 들어, 데이터가 다음과 같으면 ls -l한 줄씩 읽을 수 있고 파일의 모든 세부 정보가 한 줄에 있습니다. 이 경우에는 다음 형식의 데이터가 있습니다. 여기서 각 레코드는 빈 줄로 구분됩니다. 저는 이 데이터에 대한 쿼리를 작성할 수 있도록 기본적인 아이디어를 찾고 있을 뿐입니다.

      Source:                 test
      Destination:            test2
      Status:                 Idle
      Progress:               -
      State:                  Source
      Lag:                    16:45:45
      Mirror Timestamp:       Wed Nov  5 21:00:27 PST 2014
      Base Snapshot:          1573980876tsfr10_vol.550
      Current Transfer Type:  -
      Current Transfer Error: -
      Contents:               -
      Last Transfer Type:     -
      Last Transfer Size:     944856 KB
      Last Transfer Duration: 00:01:42
      Last Transfer From:     -

      Source:                 test12
      Destination:            test123
      Status:                 Idle
      Progress:               -
      State:                  Source
      Lag:                    10:41:00
      Mirror Timestamp:       Thu Nov  6 03:05:12 PST 2014
      Base Snapshot:          1573980876prd11_vol.1678
      Current Transfer Type:  -
      Current Transfer Error: -
      Contents:               -
      Last Transfer Type:     -
      Last Transfer Size:     83982000 KB
      Last Transfer Duration: 03:21:38
      Last Transfer From:     -

      Source:                 abcd
      Destination:            xyz
      Status:                 Idle
      Progress:               -
      State:                  Source
      Lag:                    02:40:52
      Mirror Timestamp:       Thu Nov  6 11:05:20 PST 2014
      Base Snapshot:          (1573980876prd12_vol.912
      Current Transfer Type:  -
      Current Transfer Error: -
      Contents:               -
      Last Transfer Type:     -
      Last Transfer Size:     17520680 KB
      Last Transfer Duration: 01:23:56

기본적으로 제가 생각할 수 있는 한 가지 옵션은 각 레코드에 15개의 값이 있으므로 15를 반복하고 각 행을 읽은 다음 쿼리 중인 데이터를 찾는 것입니다. 예를 들어 "소스 테스트의 전송 크기"를 찾으려고 하는 경우 ".

답변1

아마도 이 perl이 유용할 것입니다. 각 단락을 해시로 읽어서 필드를 이름으로 직접 참조할 수 있습니다.

perl -00 -F':\s+|\n' -anE '
    %data = @F; 
    say "last transfer of test = ", $data{"Last Transfer Size"}
        if $data{Source} eq "test";
' file
last transfer of test = 944856 KB

-00옵션은 일련의 빈 줄을 기준으로 입력을 레코드로 분할합니다.
-F옵션은 필드 구분 기호를 줄 바꿈 또는 콜론과 공백으로 설정합니다.
-n옵션을 사용하면 스크립트가 파일의 모든 레코드에 대해 반복됩니다.
-a옵션은 레코드를 필드로 분할하여 @F 배열에 저장합니다.

귀하의 질문에 표시된 선행 공백이 실제로 귀하의 파일에 없다고 가정합니다.

답변2

gawk1을 사용하세요 (Glenn Jackman이 제안한 대로)기록 구분 기호):

awk 'BEGIN { RS="" } /\<test\>/ { print $40,$41,$42 }' file
Size: 944856 KB

1. 참고 : 정규식 연산자 <>Gnu awk 특정.

답변3

수동으로 확인하는 경우 두 번 사용할 수 있습니다 grep.

  • 올바른 소스 이름(객체)을 사용하기 위해 한 번. grep "<source/destination name>" -A 15개체와 해당 하위 필드가 모두 인쇄됩니다(15행).
  • 두 번째로 하위 필드(객체 속성)를 찾습니다. grep "<property name>".

예를 들어, 함께 있을 때:

$ cat testfile.txt | grep "abcd" -A 15 | grep "Transfer Size"
Last Transfer Size:      17520680 KB

수동 검사에는 문제가 없지만 자동 검사에는 더 많은 정보가 필요합니다. 또한 데이터베이스는 이러한 쿼리에 가장 적합합니다.

관련 정보