[bash] bash에서 명령 출력의 첫 번째 단어를 검색하는 방법은 무엇입니까?

예를 들어 다음과 같은 명령이 있습니다 echo "word1 word2". 파이프 ( |) 를 넣고 명령에서 word1을 얻고 싶습니다 .

echo "word1 word2" | ....

나는 파이프 뒤에 무엇을 넣어야할지 모르겠다.



답변

Awk는 후행 공백을 처리해야하는 경우 좋은 옵션입니다.

echo "   word1  word2 " | awk '{print $1;}' # Prints "word1"

하지만 컷은 이것을 처리하지 않습니다.

echo "  word1  word2 " | cut -f 1 -d " " # Prints nothing/whitespace

여기서 ‘cut’은 공백 / 공백을 인쇄하지 않습니다. 공백 앞에있는 첫 번째 항목은 다른 공백 이었기 때문입니다.


답변

외부 명령을 사용할 필요가 없습니다. 배쉬 자체가 그 일을 할 수 있습니다. “word1 word2″를 어딘가에서 가져와 변수에 저장했다고 가정합니다. 예 :

$ string="word1 word2"
$ set -- $string
$ echo $1
word1
$ echo $2
word2

이제 원하는 경우 $ 1 또는 $ 2 등을 다른 변수에 할당 할 수 있습니다.


답변

효율적인 방법 중 하나는 bash 배열을 사용하는 것입니다.

array=( $string ) # do not use quotes in order to allow word expansion
echo ${array[0]}  # You can retrieve any word. Index runs from 0 to length-1

또한 파이프 라인에서 배열을 직접 읽을 수 있습니다.

echo "word1 word2" | while read -a array; do echo "${array[0]}" ; done


답변

echo "word1 word2 word3" | { read first rest ; echo $first ; }

이것은 외부 명령을 사용하지 않고 $ 1, $ 2 등의 변수를 그대로 두는 장점이 있습니다.


답변

선행 공백이없는 것이 확실한 경우 bash 매개 변수 대체를 사용할 수 있습니다.

$ string="word1  word2"
$ echo ${string/%\ */}
word1

단일 공간을 벗어나지 않도록주의하십시오. 대체 패턴의 더 많은 예는 여기 를 참조 하십시오 . bash> 3.0 인 경우 정규식 일치를 사용하여 선행 공백에 대처할 수도 있습니다 . 여기를 참조 하십시오 .

$ string="  word1   word2"
$ [[ ${string} =~ \ *([^\ ]*) ]]
$ echo ${BASH_REMATCH[1]}
word1


답변

당신은 awk을 시도 할 수 있습니다

echo "word1 word2" | awk '{ print $1 }'

awk를 사용하면 좋아하는 단어를 고르는 것이 정말 쉽습니다 ($ 1, $ 2, …)


답변

셸 매개 변수 확장 사용 %% *

다음은 쉘 매개 변수 확장을 사용하는 또 다른 솔루션 입니다. 첫 단어 뒤의 여러 공백을 처리합니다. 첫 번째 단어 앞의 공백을 처리하려면 추가 확장이 필요합니다.

string='word1    word2'
echo ${string%% *}
word1

string='word1    word2      '
echo ${string%% *}
word1

설명

%%의미 삭제 의 가장 긴 일치  *에서 (공간이 어떤 다른 문자의 수에 따라) 후행 의 일부 string.