아래 출력에서만 데이터를 가져오려고 합니다. egrep
명령을 사용하여 데이터를 제외하려고 하는데 가져오는 데이터가 다른 행에 있습니다. 한 행에 있는 데이터를 어떻게 얻을 수 있습니까?
Total: 44.75TB Used: 0.44TB Available:42.04TB Usage(5% System alocation included):6.07%
이는 요구사항입니다.
44.75 0.44 42.04 6.07
우리가 시도한 것은 다음 명령과 출력이었습니다.
# cat output| egrep -o "[+-]?[0-9]+[.]?[0-9]([eE][+-])?[0-9]"
44.75
0.44
42.04
6.07
답변1
:
그 이후의 모든 값을 가져 와서 공백이나 탭을 사용하여 연결하려는 것 같습니다.
perl
선택이다
$ perl -lne 'print join "\t",/:\h*\K[^ ]+/g' output
44.75TB 0.44TB 42.04TB 6.07%
/:\h*\K[^ ]+/g
:
a 및 선택적 가로 공백 뒤에 나타나는 공백이 아닌 문자를 가져옵니다.- 필드 구분 기호에 탭이 있을 수 있는 경우
\H
대신 사용하세요.[^ ]
- 필드 구분 기호에 탭이 있을 수 있는 경우
join "\t",
일치하는 문자열은 탭 문자를 구분 기호로 사용하여 연결됩니다.
숫자만 가져오기
$ perl -lne 'print join "\t",/:\h*\K[\d.]+/g' output
44.75 0.44 42.04 6.07
- 숫자에 숫자와 소수점만 포함되어 있고 유효성을 확인하지 않는다고 가정하면 다음 짝수 등
1.324.4
및 선택적 공백과 일치합니다....
:
답변2
입력 줄은 각각 두 개 이상의 공백으로 구분된 여러 레코드로 생각할 수 있습니다. 각 레코드는 콜론과 공백 하나를 기준으로 두 개의 필드로 나눌 수 있습니다. 우리는 그러한 각 레코드에 두 번째 필드를 원합니다.
GNU 사용 awk
(또는 mawk
, 그러나 nawk
레코드 구분 기호로 정규식을 좋아하지 않음):
$ awk -vRS=" *|\n" -vFS=": ?" -vORS=" " '{ print $2 } END { printf("\n") }' data.in
44.75TB 0.44TB 42.04TB 6.07%
RS=" *|\n"
레코드 구분 기호를 두 개 이상의 공백이나 줄바꿈으로 설정하세요. 이는Total: 44.75TB Used: 0.44TB
두 개의 레코드 로 나누어지며 ,Total: 44.75TB
.Used: 0.44TB
FS=": ?"
필드 구분 기호를 콜론으로 설정하고 선택적으로 뒤에 공백을 추가합니다. 이는Used: 0.44TB
두 개의 필드 로 구분Used
됩니다0.44TB
.ORS=" "
설정산출구분 기호를 공백으로 기록합니다.
코드 awk
는 각 레코드의 두 번째 필드를 로 구분하고 ORS
출력에서 개행 문자로 종료하여 인쇄합니다.
숫자가 아닌 모든 것을 제거하려면 다음을 전달하십시오 tr -dc '0-9. \n'
.
$ awk -vRS=" *|\n" -vFS=": ?" -vORS=" " '{ print $2 } END { printf("\n") }' data.in | tr -dc '0-9. \n'
44.75 0.44 42.04 6.07
tr -dc '0-9. \n'
숫자, 점, 공백 또는 개행 문자를 제외한 모든 항목이 제거됩니다.