다음 내용이 포함된 파일이 있습니다.
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)
설명하다:
- 포함된 줄에서는
:
현재 레코드에 다음 줄을 추가합니다. - 그런 다음 원래 줄에서 마지막 줄까지 줄바꿈을 제거
(
하고 이를 교체하여(
레코드를 인쇄합니다. 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)