이 경우 왜 cut -d ' '가 공백과 함께 작동하지 않습니까?

이 경우 왜 cut -d ' '가 공백과 함께 작동하지 않습니까?

이 명령에는 아무런 문제가 없습니다 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공백으로 분할하는 기본값과 다르지만 여러 공백을 하나의 구분 기호로 처리하고 선행 공백을 무시합니다.

필드 구분 기호를 다음과 같이 설정하여 FSawk가 유사하게 작동하도록 할 수 있습니다 [ ].

$ 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이를 업스트림에 제출하여 유틸리티를 더욱 다양하게 만들고 다양한 실제 시나리오에서 사용할 수 있게 만들고 싶습니다 .

관련 정보