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
gawk
1을 사용하세요 (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
수동 검사에는 문제가 없지만 자동 검사에는 더 많은 정보가 필요합니다. 또한 데이터베이스는 이러한 쿼리에 가장 적합합니다.