이것은 간단하고 짧으며 작성, 이해 및 확인이 쉽고 개인적으로 좋아합니다.
grep -oE '\S+$' file
grep
우분투에서 호출 할 때, -E
또는 -P
의 소요 속기 \s
비열한하는 공백 문자를 (실제로는 일반적으로 공백이나 탭)과 \S
하나가 아닌 평균 아무것도. 사용 수량 어+
및 행의 끝 앵커$
, 패턴은 \S+$
라인의 단부에 하나 이상의 비 - 블랭크 일치 . -P
대신에 사용할 수 있습니다 -E
; 이 경우 의미 는 동일하지만 다른 정규식 엔진 이 사용되므로 성능 특성이 다를 수 있습니다 .
이것은 Avinash Raj의 논평 솔루션 과 동일합니다 (더 쉽고 간결한 구문으로).
grep -o '[^[:space:]]\+$' file
후행 공백이있을 수 있다면이 방법이 작동하지 않습니다 후에 수. 그것들은 그렇게 할 수 있도록 수정 될 수 있지만, 여기서는 아무런 의미가 없습니다. 더 경우에 따라 작업에 대한 해결책을 일반화 때로는 교훈 비록 하나는 일반적으로 알 수있는 방법이 없기 때문에, 그것은, 그래서 거의 자주 사람들이 생각하는 경향이 할 실용적이지의 다양한 호환되지 않는 방법으로있는 문제가 궁극적으로해야 할 수도 있습니다를 일반화되다.
때로는 성능이 중요한 고려 사항입니다. 이 질문은 입력이 매우 크다고 명시하지 않으며 여기에 게시 된 모든 방법이 충분히 빠를 수 있습니다. 그러나 속도가 필요한 경우 천만 줄 입력 파일에 대한 작은 벤치 마크가 있습니다.
$ perl -e 'print((<>) x 2000000)' file > bigfile
$ du -sh bigfile
439M bigfile
$ wc -l bigfile
10000000 bigfile
$ TIMEFORMAT=%R
$ time grep -o '[^[:space:]]\+$' bigfile > bigfile.out
819.565
$ time grep -oE '\S+$' bigfile > bigfile.out
816.910
$ time grep -oP '\S+$' bigfile > bigfile.out
67.465
$ time cut -d= -f2 bigfile > bigfile.out
3.902
$ time grep -o '[^[:space:]]\+$' bigfile > bigfile.out
815.183
$ time grep -oE '\S+$' bigfile > bigfile.out
824.546
$ time grep -oP '\S+$' bigfile > bigfile.out
68.692
$ time cut -d= -f2 bigfile > bigfile.out
4.135
순서가 문제가되는 경우 (때로는 I / O가 많은 작업에서와 같이) 두 번 실행했으며 백그라운드에서 다른 작업을 수행하지 않는 기계가 없기 때문에 결과가 왜곡 될 수 있습니다. 그 결과로부터 나는 적어도 임시적으로 그리고 내가 사용한 크기의 입력 파일에 대해 다음을 결론 지었다.
와! 전달 -P
(사용에 PCRE 가 아닌) -G
또는 (더 방언이 지정되지 않은 기본) -E
만들어진 grep
크기 순서를 통해 빠르게하여. 따라서 큰 파일의 경우 위에 표시된 것보다이 명령을 사용하는 것이 좋습니다.
grep -oP '\S+$' file
와!! cut
의 방법 αғsнιη의 대답은 , , 빨리 내 방식의 경우에도 빠른 버전보다 크기 순서 이상입니다! pa4080의 벤치 마크에서도이 방법 에 비해이 방법보다 더 많은 방법을 다루었지만 입력이 더 적으므로 다른 모든 방법 중에서 테스트에 포함시키기 위해이 방법을 선택했습니다. 성능이 중요하거나 파일이 크면 αғsнιη의 방법을 사용해야 한다고 생각 합니다.cut -d= -f2 file
cut
이것은 또한 간단한 도구 cut
와 paste
유틸리티 를 잊어서는 안된다는 것을 상기 시키는 역할을하며 , grep
종종 일차 솔루션으로 제공되는 것과 같은보다 정교한 도구가 있지만 개인적으로 더 익숙해 져도 적용 가능할 때 선호되어야합니다 사용).
grep -o '[^[:space:]]\+$' file