![이 경우 왜 cut -d ' '가 공백과 함께 작동하지 않습니까?](https://linux55.com/image/179394/%EC%9D%B4%20%EA%B2%BD%EC%9A%B0%20%EC%99%9C%20cut%20-d%20'%20'%EA%B0%80%20%EA%B3%B5%EB%B0%B1%EA%B3%BC%20%ED%95%A8%EA%BB%98%20%EC%9E%91%EB%8F%99%ED%95%98%EC%A7%80%20%EC%95%8A%EC%8A%B5%EB%8B%88%EA%B9%8C%3F.png)
이 명령에는 아무런 문제가 없습니다 cut
.
wolf@linux:~$ echo ab cd ef
ab cd ef
wolf@linux:~$ echo ab cd ef | cut -d ' ' -f 1
ab
wolf@linux:~$ echo ab cd ef | cut -d ' ' -f 2
cd
그러나 다른 입력으로 동일한 명령을 시도하면 예상한 출력이 나오지 않습니다.
wolf@linux:~$ ip address show eth0 | grep 'inet '
inet 10.10.10.10/24 brd 10.10.10.255 scope global dynamic eth0
wolf@linux:~$ ip address show eth0 | grep 'inet ' | cut -d ' ' -f 1
wolf@linux:~$ ip address show eth0 | grep 'inet ' | cut -d ' ' -f 2
두 번째 예의 문제점은 무엇입니까?
awk
이상하게도 동일한 입력이 문제 없이 작동하는 것 같습니다.
wolf@linux:~$ ip address show eth0 | awk '/inet / {print $1}'
inet
wolf@linux:~$ ip address show eth0 | awk '/inet / {print $2}'
10.10.10.10/24
답변1
cut
연속된 공백이 있더라도 각 구분 기호에는 의미가 있습니다. 이는 awk
공백으로 분할하는 기본값과 다르지만 여러 공백을 하나의 구분 기호로 처리하고 선행 공백을 무시합니다.
필드 구분 기호를 다음과 같이 설정하여 FS
awk가 유사하게 작동하도록 할 수 있습니다 [ ]
.
$ ip add show lo | awk -F'[ ]' '$5 == "inet" {print $6}'
127.0.0.1/8
FS
단일 공백 자체가 기본 특수 연산을 표시하므로 정규식처럼 설정해야 합니다 .
예를 들어 GNU awk 매뉴얼에서는 다음과 같이 말합니다.필드 구분자에.
답변2
grep 출력의 줄은 4개의 공백으로 시작하고, 다섯 번째 필드를 선택하면 첫 번째 문자열이 표시됩니다.
admin:~ # ip address show eth0 | grep 'inet ' | cut -d " " -f 5
inet
답변3
내가 만들었다패치필드 모드에서 작동하고 여러 연속 구분 기호를 단일 구분 기호로 처리하는 새로운 -m
명령줄 옵션이 추가되었습니다. cut
이는 기본적으로 OP의 문제를 상당히 효율적인 방식으로 해결합니다. 나는 또한 이 패치가 coreutils 프로젝트에 병합되기를 바라면서 며칠 전에 이 패치 업스트림을 제출했습니다.
일부가 있습니다더 많은 생각공백 관련 기능을 더 추가하는 것에 대한 피드백을 갖고 cut
이 모든 것에 대한 피드백을 제공하면 좋을 것입니다. 더 많은 패치를 구현하고 cut
이를 업스트림에 제출하여 유틸리티를 더욱 다양하게 만들고 다양한 실제 시나리오에서 사용할 수 있게 만들고 싶습니다 .