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/' cucumbers
sed
명령 (대체 할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}’
오이
에서는 awk
NF는 선 필드의 개수가 너무 $NF
행의 마지막 필드를 의미한다.