source

Bash에서 명령어 출력의 첫 번째 단어를 검색하려면 어떻게 해야 합니까?

lovecheck 2023. 4. 12. 22:30
반응형

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로 측정했습니다.timeit5글자로 구성된 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

반응형