명령 행 : 출력에서 ​​부분 문자열 추출


25

SayStuff 명령을 실행한다고 가정 해 봅시다.

$ SayStuff

출력은

Watermelons and cucumbers

지금. cucumbers출력 에서 하위 문자열을 추출하여 무언가로 파이프 하고 싶다고 가정 해보십시오 .
프로그래밍 방식 으로이 작업을 수행하는 방법은 출력을 구분 기호 Space 로 배열로 나누고로 참조하는 것 ArrayName[2]입니다. 나는 쉘 스크립트를 처음 접했고 반 암호 cut예제 를 파는 데 성공했지만 그 어느 것도 의미가 없습니다.

어떤 아이디어?

답변:


30
$ echo "Watermelons and cucumbers" | cut -d ' ' -f 3
cucumbers

-d ' '말한다 cut공간을 분할 할 수 있습니다. -f 3세 번째 열을 선택합니다.

또한 사용할 수있는 awk이미 공간을 기준으로 분할을 수행하고 열을 사용할 수있게하는, $1, $2, ...

$ echo "Watermelons and cucumbers" | awk '{ print $3 }'
cucumbers

참고 cut하면서, 공간의 변수 수를 처리하지 awk않습니다.
Zitrax

13

아마도 @slhck에 의해 이미 제공된 옵션 중 하나를 사용하지만 다음과 같은 몇 가지 방법이 있습니다.

  1. 다른 언어와 마찬가지로 배열 사용

    $ foo=( $(SayStuff) ) 
    $ echo ${foo[2]}
    cucumbers

    var=()선언은 배열을 선언 $(command)하고 명령의 출력을 저장합니다. 따라서 foo=( $(SayStuff) )출력을 SayStuff배열에 저장 foo하고 yuou를 echo가진 세 번째 요소입니다 ${foo[2]}.

  2. sed

    $ SayStuff | sed 's/.* \(.*\)/\1/'
    cucumbers

    sed명령 (대체 할 s///마지막 단어) 다. 정규식은 공백에 .*이르는 모든 것을 일치 시키며, 마지막 공백에 이르는 모든 것을 일치시키고 마지막 단어를 캡처합니다 (\(.*\). 단어가 캡처되었으므로로 지칭 할 수 있습니다 \1.

    더 간단한 버전 :

    $ SayStuff | sed 's/.* //'
    cucumbers
  3. 세게 때리다

    $ foo=$(SayStuff); echo ${foo##* } 
    cucumbers

    이것은 bash의 문자열 조작 기능을 사용합니다 . 자세한 내용 은 여기 를 참조하십시오.

  4. 더 많은 배쉬

    $ SayStuff | while read a b c; do echo $c; done
    cucumbers
  5. 펄, 물론이 작업을 수행하는 방법은 여러 가지가 있습니다.

    $ SayStuff | perl -lane 'print $F[$#F]'
    cucumber

    -a차종은 perl같이 행동 awk공백에 분할 선 및 배열에 저장 @F. 그런 다음 @F( $#F의 요소 수인)의 마지막 요소를 인쇄합니다 @F. 이 명령 -l은 perl에게 각 print명령문에 개행을 추가하도록 지시 -n합니다. STDIN을 한 행씩 처리 -e해야하며 명령 행에서 제공된 스크립트를 실행해야합니다.

    $ SayStuff | perl -pe 's/.* //'
    cucumber

    옵션은 위에서 설명했지만 마지막 공간까지 모든 것을 삭제하고 인쇄 중입니다 ( -p).

    $ perl -le 'print $ARGV[$#ARGV]' $(SayStuff)
    cucumbers

    여기서 우리는 Watermelons and cucumbers인수 로 전달합니다. 펄은 @ARG배열에 저장할 것이므로의 마지막 요소를 인쇄합니다 @ARG.

  6. 속임수. 이것은 sed공백을 개행 문자로 변환 한 다음 tail마지막 행만 인쇄하는 데 사용됩니다.

    $ SayStuff | sed 's/ /\n/g' | tail -n 1
    cucumbers
  7. grep 및 regular expression -o은 일치하는 문자열 만 인쇄합니다.

    $ SayStuff | grep -Po '\w+$' 
    cucumbers
  8. 부정 행위

    $ SayStuff | grep -o cucumbers
    cucumbers

2

더 자세한 설명은 다음과 같습니다.

Usage: cut OPTION... [FILE]...

Print selected parts of lines from each FILE to standard output.

   -d, --delimiter=DELIM
          use DELIM instead of TAB for field delimiter

   -f, --fields=LIST
          select only these fields;  also print any line that contains  no
          delimiter character, unless the -s option is specified

따라서 세 번째 필드가 필요하고 공백으로 구분되어 있으면 ''

$ echo "Watermelons and cucumbers" | cut -d ' ' -f 3  
cucumbers

당신이 원하는 경우 LAST 필드에 당신은 아마 사용해야합니다 AWK .
이 경우에는 다음과 같이됩니다.

$ echo "수박과 오이"| awk '{print $ NF}'
오이

에서는 awkNF는 선 필드의 개수가 너무 $NF행의 마지막 필드를 의미한다.


기본적으로 같은 질문은 여기에있다하지만 더 일반화 : stackoverflow.com/questions/3162385/...이 예는 다른 방법을 사용할 수 있지만 AWK는 짧다
zeridon
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.