file.log:

file.log:

삭제에 더 적합한 명령은 무엇입니까?빈 줄16진수 덤프 파일에서 부품을 서로 접착합니까?

sed -i '/^$/d' file.log    
sed -i '/^\s*$/d' file.log

아니면 어쩌면 awk?

801c3fb0: 0000 2821  0c18 9741  2406 0020  afb0 0010 | ..(!...A$.. ....
801c3fc0: 2402 0014  afa2 0038  8e22 00e4  2404 0064 | $......8."..$..d
801c3fd0: 0000 2821  03a0 3021  0040 f809  27a7 0038 | ..(!..0!.@..'..8
801c3fe0: 1040 001d  0040 9021  2630 0008  0200 2021 | .@...@.!&0.... !
801c3ff0: 0c0a 8935  2405 0002  5040 0064  0000 1021 | [email protected]...!


801c4000: 0200 2021  0c0a 8935  2405 0002  0200 2021 | .. !...5$..... !
801c4010: 0040 2821  2406 0002  3c07 8074  0c0a 86a5 | .@(!$...<..t....
801c4020: 24e7 10fc  0040 2021  3c05 8074  0c1b 634c | $....@ !<..t..cL

답변1

두 번째 sed솔루션은 거의 모든 경우에 잘 작동하지만 다음과 같은 이유로 다른 솔루션이 있습니다.

file.log:

$ cat file.log
801c3fb0: 0000 2821  0c18 9741  2406 0020  afb0 0010 | ..(!...A$.. ....

Empty line before-801c3fc0: 2402 0014  afa2 0038  8e22 00e4  2404 0064 | $......8."..$..d

Space before-801c3fd0: 0000 2821  03a0 3021  0040 f809  27a7 0038 | ..(!..0!.@..'..8

Tab before-801c3fe0: 1040 001d  0040 9021  2630 0008  0200 2021 | .@...@.!&0.... !

두 번째 줄은 완전히 비어 있고, 4번 줄에는 공백이 있고, 6번 줄에는 탭이 있습니다.


sed:

sed '/^$/d' file.log

$ sed '/^$/d' file.log
801c3fb0: 0000 2821  0c18 9741  2406 0020  afb0 0010 | ..(!...A$.. ....
Empty line before-801c3fc0: 2402 0014  afa2 0038  8e22 00e4  2404 0064 | $......8."..$..d

Space before-801c3fd0: 0000 2821  03a0 3021  0040 f809  27a7 0038 | ..(!..0!.@..'..8

Tab before-801c3fe0: 1040 001d  0040 9021  2630 0008  0200 2021 | .@...@.!&0.... !

위에 표시된 것처럼 공백이 포함된 줄은 제거되지 않습니다.

sed '/^\s*$/d' file.log

$ sed '/^\s*$/d' file.log
801c3fb0: 0000 2821  0c18 9741  2406 0020  afb0 0010 | ..(!...A$.. ....
Empty line before-801c3fc0: 2402 0014  afa2 0038  8e22 00e4  2404 0064 | $......8."..$..d
Space before-801c3fd0: 0000 2821  03a0 3021  0040 f809  27a7 0038 | ..(!..0!.@..'..8
Tab before-801c3fe0: 1040 001d  0040 9021  2630 0008  0200 2021 | .@...@.!&0.... !

참고: 위의 해결 방법은 BSD sed에서는 작동하지 않는 것 같습니다.

sed '/^[[:space:]]*$/d' file.log

$ sed '/^[[:space:]]*$/d' file.log
801c3fb0: 0000 2821  0c18 9741  2406 0020  afb0 0010 | ..(!...A$.. ....
Empty line before-801c3fc0: 2402 0014  afa2 0038  8e22 00e4  2404 0064 | $......8."..$..d
Space before-801c3fd0: 0000 2821  03a0 3021  0040 f809  27a7 0038 | ..(!..0!.@..'..8
Tab before-801c3fe0: 1040 001d  0040 9021  2630 0008  0200 2021 | .@...@.!&0.... !

이 솔루션은 GNU 및 BSD sed 모두에서 작동합니다.


awk:

awk 'NF' file.log

$ awk 'NF' file.log
801c3fb0: 0000 2821  0c18 9741  2406 0020  afb0 0010 | ..(!...A$.. ....
Empty line before-801c3fc0: 2402 0014  afa2 0038  8e22 00e4  2404 0064 | $......8."..$..d
Space before-801c3fd0: 0000 2821  03a0 3021  0040 f809  27a7 0038 | ..(!..0!.@..'..8
Tab before-801c3fe0: 1040 001d  0040 9021  2630 0008  0200 2021 | .@...@.!&0.... !

내부 수정은 되지 않지만 GNU awk가 있는 경우 다음 명령을 사용할 수 있습니다.

awk -i inplace 'NF' file.log

grep:

grep -v '^$' file.log

$ grep -v '^$' file.log
801c3fb0: 0000 2821  0c18 9741  2406 0020  afb0 0010 | ..(!...A$.. ....
Empty line before-801c3fc0: 2402 0014  afa2 0038  8e22 00e4  2404 0064 | $......8."..$..d

Space before-801c3fd0: 0000 2821  03a0 3021  0040 f809  27a7 0038 | ..(!..0!.@..'..8

Tab before-801c3fe0: 1040 001d  0040 9021  2630 0008  0200 2021 | .@...@.!&0.... !

위에 표시된 것처럼 공백이 포함된 줄은 제거되지 않습니다. 또한 이는 파일을 수정하지 않습니다.

grep . file.log

$ grep . file.log
801c3fb0: 0000 2821  0c18 9741  2406 0020  afb0 0010 | ..(!...A$.. ....
Empty line before-801c3fc0: 2402 0014  afa2 0038  8e22 00e4  2404 0064 | $......8."..$..d

Space before-801c3fd0: 0000 2821  03a0 3021  0040 f809  27a7 0038 | ..(!..0!.@..'..8

Tab before-801c3fe0: 1040 001d  0040 9021  2630 0008  0200 2021 | .@...@.!&0.... !

위에 표시된 것처럼 공백이 포함된 줄은 제거되지 않습니다. 또한 이는 파일을 수정하지 않습니다.

grep -v '^\s*$' file.log

$ grep -v '^\s*$' file.log
801c3fb0: 0000 2821  0c18 9741  2406 0020  afb0 0010 | ..(!...A$.. ....
Empty line before-801c3fc0: 2402 0014  afa2 0038  8e22 00e4  2404 0064 | $......8."..$..d
Space before-801c3fd0: 0000 2821  03a0 3021  0040 f809  27a7 0038 | ..(!..0!.@..'..8
Tab before-801c3fe0: 1040 001d  0040 9021  2630 0008  0200 2021 | .@...@.!&0.... !

이렇게 하면 파일이 수정되지는 않지만 리디렉션을 사용하여 원하는 내용이 포함된 새 파일을 만들 수 있습니다.


tr:

tr -s '\n' <file.log

$ tr -s '\n' <file.log
801c3fb0: 0000 2821  0c18 9741  2406 0020  afb0 0010 | ..(!...A$.. ....
Empty line before-801c3fc0: 2402 0014  afa2 0038  8e22 00e4  2404 0064 | $......8."..$..d

Space before-801c3fd0: 0000 2821  03a0 3021  0040 f809  27a7 0038 | ..(!..0!.@..'..8

Tab before-801c3fe0: 1040 001d  0040 9021  2630 0008  0200 2021 | .@...@.!&0.... !

위에 표시된 것처럼 공백이 포함된 줄은 제거되지 않습니다. 또한 이는 파일을 수정하지 않습니다.


perl:

perl -n -e "print if /\S/" file.log

$ perl -n -e "print if /\S/" file.log
801c3fb0: 0000 2821  0c18 9741  2406 0020  afb0 0010 | ..(!...A$.. ....
Empty line before-801c3fc0: 2402 0014  afa2 0038  8e22 00e4  2404 0064 | $......8."..$..d
Space before-801c3fd0: 0000 2821  03a0 3021  0040 f809  27a7 0038 | ..(!..0!.@..'..8
Tab before-801c3fe0: 1040 001d  0040 9021  2630 0008  0200 2021 | .@...@.!&0.... !

현재 위치에서 수정하려면 다음 명령을 사용하십시오.

perl -i.bak -n -e "print if /\S/" file.log

답변2

이 두 명령의 유일한 차이점은 sed두 번째 명령은 빈 줄의 공백이나 탭을 고려한다는 것입니다.

파일의 빈 줄에 공백/탭이 있는 것 같습니다. 이것이 바로 sed첫 번째 명령이 공백/탭을 제거하지 못한 이유입니다.

두 번째 sed명령을 사용하십시오. 테스트를 거쳐 귀하의 파일에 작동하는지 확인했습니다.

관련 정보