SayStuff 명령을 실행한다고 가정 해 봅시다.
$ SayStuff
출력은
Watermelons and cucumbers
지금. cucumbers출력 에서 하위 문자열을 추출하여 무언가로 파이프 하고 싶다고 가정 해보십시오 .
프로그래밍 방식 으로이 작업을 수행하는 방법은 출력을 구분 기호 Space 로 배열로 나누고로 참조하는 것 ArrayName[2]입니다. 나는 쉘 스크립트를 처음 접했고 반 암호 cut예제 를 파는 데 성공했지만 그 어느 것도 의미가 없습니다.
어떤 아이디어?
답변
$ echo "Watermelons and cucumbers" | cut -d ' ' -f 3
cucumbers
는 -d ' '말한다 cut공간을 분할 할 수 있습니다. -f 3세 번째 열을 선택합니다.
또한 사용할 수있는 awk이미 공간을 기준으로 분할을 수행하고 열을 사용할 수있게하는, $1, $2, …
$ echo "Watermelons and cucumbers" | awk '{ print $3 }'
cucumbers
답변
아마도 @slhck에 의해 이미 제공된 옵션 중 하나를 사용하지만 다음과 같은 몇 가지 방법이 있습니다.
-
다른 언어와 마찬가지로 배열 사용
$ foo=( $(SayStuff) ) $ echo ${foo[2]} cucumbers이
var=()선언은 배열을 선언$(command)하고 명령의 출력을 저장합니다. 따라서foo=( $(SayStuff) )출력을SayStuff배열에 저장foo하고 yuou를echo가진 세 번째 요소입니다${foo[2]}. -
sed$ SayStuff | sed 's/.* \(.*\)/\1/' cucumberssed명령 (대체 할s///마지막 단어) 다. 정규식은 공백에.*이르는 모든 것을 일치 시키며, 마지막 공백에 이르는 모든 것을 일치시키고 마지막 단어를 캡처합니다(\(.*\). 단어가 캡처되었으므로로 지칭 할 수 있습니다\1.더 간단한 버전 :
$ SayStuff | sed 's/.* //' cucumbers -
세게 때리다
$ foo=$(SayStuff); echo ${foo##* } cucumbers이것은 bash의 문자열 조작 기능을 사용합니다 . 자세한 내용 은 여기 를 참조하십시오.
-
더 많은 배쉬
$ SayStuff | while read a b c; do echo $c; done cucumbers -
펄, 물론이 작업을 수행하는 방법은 여러 가지가 있습니다.
$ 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. -
속임수. 이것은
sed공백을 개행 문자로 변환 한 다음tail마지막 행만 인쇄하는 데 사용됩니다.$ SayStuff | sed 's/ /\n/g' | tail -n 1 cucumbers -
grep 및 regular expression
-o은 일치하는 문자열 만 인쇄합니다.$ SayStuff | grep -Po '\w+$' cucumbers -
부정 행위
$ SayStuff | grep -o cucumbers cucumbers
답변
더 자세한 설명은 다음과 같습니다.
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행의 마지막 필드를 의미한다.