Bash에서 명령어 출력의 첫 번째 단어를 검색하려면 어떻게 해야 합니까?
예를 들어 다음과 같은 명령어가 있습니다.echo "word1 word2"
파이프를 꽂고 싶다.|
명령어로부터 「word1」을 취득합니다.
echo "word1 word2" | ....
파이프 뒤에 뭘 넣을까요?
AWK는 후행 공백을 처리해야 하는 경우 다음과 같이 처리되므로 AWK를 사용하는 것이 좋습니다.
echo " word1 word2 " | awk '{print $1;}' # Prints "word1"
컷은 이 문제를 해결할 수 없습니다.
echo " word1 word2 " | cut -f 1 -d " " # Prints nothing/whitespace
여기서 '컷'은 공백/공백이 인쇄되지 않습니다. 공백 전에 첫 번째 항목은 다른 공간이었기 때문입니다.
외부 명령어를 사용할 필요가 없습니다.Bash는 그 일을 할 수 있다.예를 들어, 어딘가에서 가져와 변수에 저장한 "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 등의 변수를 그대로 유지한다는 장점이 있습니다.
셸 매개 변수 확장 사용%% *
셸 파라미터 확장을 사용한 다른 솔루션을 다음에 나타냅니다.첫 번째 단어 뒤에 여러 개의 공백이 있습니다.첫 번째 단어 앞에 공백을 처리하려면 한 번 더 확장해야 합니다.
string='word1 word2'
echo ${string%% *}
word1
string='word1 word2 '
echo ${string%% *}
word1
설명.
그%%
가능한 가장 긴 일치를 삭제하는 것을 나타냅니다. *
(다른 문자의 수에 따라 이어지는 공백)의 후행 부분string
.
AWK를 사용해 보세요.
echo "word1 word2" | awk '{ print $1 }'
AWK를 사용하면 원하는 단어를 쉽게 선택할 수 있습니다($1
,$2
등).
선두에 공백이 없는 경우 Bash 파라미터 치환을 사용할 수 있습니다.
$ string="word1 word2"
$ echo ${string/%\ */}
word1
단일 공간 탈출에 주의하십시오.치환 패턴의 예에 대해서는, 여기를 참조해 주세요.Bash > 3.0 의 경우는, 선두의 스페이스에 대응하기 위해서 정규 표현 매칭을 사용할 수도 있습니다.여기를 참조해 주세요.
$ string=" word1 word2"
$ [[ ${string} =~ \ *([^\ ]*) ]]
$ echo ${BASH_REMATCH[1]}
word1
나는 상위 답안들 중 몇 개가 속도 면에서 어떻게 비교되는지 궁금했다.다음을 테스트했습니다.
1 @matbh
echo "..." | awk '{print $1;}'
2 @sqdog74's
string="..."; set -- $string; echo $1
3 @boontawee-home
echo "..." | { read -a array ; echo ${array[0]} ; }
및 4개의 @boontawee-home
echo "..." | { read first _ ; echo $first ; }
Python's로 측정했습니다.timeit
5글자로 구성된 215개의 단어가 포함된 테스트 문자열을 사용하여 macOS의 zsh 터미널에 있는 Bash 스크립트에서 사용할 수 있습니다.각 측정을 5회 실시(모두 100루프, 베스트 오브 3에 대한 결과)하여 평균값을 구했습니다.
Method Time
--------------------------------
1. awk 9.2 ms
2. set 11.6 ms (1.26 * "1")
3. read -a 11.7 ms (1.27 * "1")
4. read 13.6 ms (1.48 * "1")
echo "word1 word2" | cut -f 1 -d " "
첫 번째 필드를 절단하다-f 1
( " " )로 구분된 필드 에서 를 -d " "
를 참조해 주세요.
read
다음 중 하나:
문자열이 변수에 있는 경우:
string="word1 word2" read -r first _ <<< "$string" printf '%s\n' "$first"
파이프에서 작업하는 경우: 첫 번째 경우: 첫 번째 줄의 첫 번째 단어만 사용합니다.
printf '%s\n' "word1 word2" "line2" | { read -r first _; printf '%s\n' "$first"; }
두 번째 경우: 각 행의 첫 번째 단어를 원합니다.
printf '%s\n' "word1 word2" "worda wordb" | while read -r first _; do printf '%s\n' "$first"; done
선행 스페이스가 있는 경우는, 다음과 같이 동작합니다.
printf '%s\n' " word1 word2" | { read -r first _; printf '%s\n' "$first"; }
Perl은 AWK의 기능을 통합하고 있기 때문에, 이것은 Perl에서도 해결할 수 있습니다.
echo " word1 word2" | perl -lane 'print $F[0]'
새 명령어를 설치해도 괜찮으시다면
모든 대안 중에서 가장 단순하고 직관적인 인터페이스를 제공합니다.
echo "word1 word2" | choose 0
저는 Perl, AWK, Python이 없는 임베디드 기기를 사용하고 있었습니다.대신 sed로 작업했습니다.첫 번째 단어 앞에 여러 공간을 지원합니다.cut
★★★★★★★★★★★★★★★★★」bash
(미국의
VARIABLE=" first_word_with_spaces_before_and_after another_word "
echo $VARIABLE | sed 's/ *\([^ ]*\).*/\1/'
을 할 때 했습니다.ps
만을 사용하는 첫을 삭제할 수 때문에 의 ps
을 사용하다
언급URL : https://stackoverflow.com/questions/2440414/how-can-i-retrieve-the-first-word-of-the-output-of-a-command-in-bash
'source' 카테고리의 다른 글
[ WPF ListBox ]를 [Selected]으로 스크롤합니다.뷰 모델의 코드에 설정된 항목 (0) | 2023.04.12 |
---|---|
jQuery를 사용하여 데이터 속성별 요소 선택 (0) | 2023.04.12 |
특정 커밋에 대한 리모트 리셋 (0) | 2023.04.12 |
Java에서 Excel 파일 생성 (0) | 2023.04.12 |
아이폰 앱에서 NSError를 사용하려면 어떻게 해야 하나요? (0) | 2023.04.12 |