한 줄로 egrep -o 출력 얻기

한 줄로 egrep -o 출력 얻기

아래 출력에서만 데이터를 가져오려고 합니다. 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'숫자, 점, 공백 또는 개행 문자를 제외한 모든 항목이 제거됩니다.

관련 정보