정규식 형식의 파일 출력

정규식 형식의 파일 출력

다음 내용이 포함된 파일이 있습니다.

   foo-6-25.example.com:
         1  Var. Speed   System Board    Normal     Yes     Normal   ( 49)
    --
    foo-5-4.example.com:
         1  Var. Speed   System Board    Normal     Yes     Normal   ( 19)
    --
    foo-8-28.example.com:
         1  Var. Speed   System Board    Normal     Yes     Normal   ( 43)
    --
    foo-9-7.example.com:
         1  Var. Speed   System Board    Normal     Yes     Normal   ( 91)
    --
    foo-5-19.idmz.example.com:
         1  Var. Speed   System Board    Normal     Yes     Normal   ( 19)
    --
    foo-7-3.example.com:
         1  Var. Speed   System Board    Normal     Yes     Normal   ( 20)

다음과 같이 형식을 지정하고 싶습니다. 서버 이름, ()괄호 안의 팬 속도

foo-6-25.example.com: ( 49)
foo-5-4.example.com:  ( 19)

awk나 다른 도구를 사용하여 사용하는 방법을 모릅니다.

답변1

awk해결책

$ awk '/:/{d=$1}/Speed/{printf"%-28s%s\n",d,substr($0,length($0)-4)}' file
foo-6-25.example.com:       ( 49)
foo-5-4.example.com:        ( 19)
foo-8-28.example.com:       ( 43)
foo-9-7.example.com:        ( 91)
foo-5-19.idmz.example.com:  ( 19)
foo-7-3.example.com:        ( 20)
$

awk+ column솔루션

열을 동적으로 정렬합니다.

$ awk '/:/{d=$1}/Speed/{print d,substr($0,length($0)-4)}' file|column -to' '
foo-6-25.example.com:       ( 49)
foo-5-4.example.com:        ( 19)
foo-8-28.example.com:       ( 43)
foo-9-7.example.com:        ( 91)
foo-5-19.idmz.example.com:  ( 19)
foo-7-3.example.com:        ( 20)
$

답변2

$ sed -e '/--/d;N;s/\n/ /;s/[[:blank:]]\+//;s/[[:blank:]]\+[^(]\+/, /' file | column -ts ','
foo-6-25.example.com:        ( 49)
foo-5-4.example.com:         ( 19)
foo-8-28.example.com:        ( 43)
foo-9-7.example.com:         ( 91)
foo-5-19.idmz.example.com:   ( 19)
foo-7-3.example.com:         ( 20)

두 번째 열에 간격/정렬을 적용하지 않으려면 다음 column명령을 생략할 수 있습니다.

$ sed -e '/--/d;N;s/\n/ /;s/[[:blank:]]\+//;s/[[:blank:]]\+[^(]\+/ /' file
foo-6-25.example.com: ( 49)
foo-5-4.example.com: ( 19)
foo-8-28.example.com: ( 43)
foo-9-7.example.com: ( 91)
foo-5-19.idmz.example.com: ( 19)
foo-7-3.example.com: ( 20)

GNU를 사용하는 경우 sed더 줄일 수 있습니다.

$ sed -e '/--/d;N;s/\n/ /;s/[ ]\+//;s/[ ]\+[^(]\+/ /' file

답변3

% perl -ne 'print(($_ .= <>) =~ s/\n.*\(/ (/r) if /:/' input.file

산출:

foo-6-25.example.com: ( 49)
foo-5-4.example.com: ( 19)
foo-8-28.example.com: ( 43)
foo-9-7.example.com: ( 91)
foo-5-19.idmz.example.com: ( 19)
foo-7-3.example.com: ( 20)

설명하다:

  1. 포함된 줄에서는 :현재 레코드에 다음 줄을 추가합니다.
  2. 그런 다음 원래 줄에서 마지막 줄까지 줄바꿈을 제거 (하고 이를 교체하여 ( 레코드를 인쇄합니다.
  3. perl라고 하기 때문에 -n영향을 받지 않은 레코드는 인쇄되지 않습니다.

Sed동일한 콘텐츠를 작성하는 매우 간단한 방법이 있습니다.

sed -ne '/:/N;s/\n.*(/ (/p' input.file

답변4

awk 사용단락 모드

awk -vRS='\n[ \t]*--' '
  match($0, /\( *[0-9]+\)/) {print $1, substr($0,RSTART,RLENGTH)}
' file
foo-6-25.example.com: ( 49)
foo-5-4.example.com: ( 19)
foo-8-28.example.com: ( 43)
foo-9-7.example.com: ( 91)
foo-5-19.idmz.example.com: ( 19)
foo-7-3.example.com: ( 20)

관련 정보