cut 명령으로 마지막 필드 만 읽을 수있는 방법이 있습니까?


13

공백으로 분할하는 데 cut사용하여 파이프로 연결하는 명령으로 출력되는 공백으로 구분 된 문자열이 -fd ' '있습니다. -f <n>field number를 표시 하는 데 사용할 수 <n>있지만 문자열의 길이를 모르는 경우 마지막 필드를 표시하도록 할 수 있습니까?

또는 내가 좋아하는 도구를 편집하는보다 유연한 텍스트 사용해야 할 sed또는 awk?


cut 명령은 지원할 수 없지만 확실하지는 않지만 cut -d ''-f- 시도해 보셨습니까?
αғsнιη


@KasiyA -n는 시작 n-부터 n까지, n부터 끝까지이며, --complement선택을 취소하는 옵션이 있습니다. 그러나 내가 말할 수있는 한 필드의 수를 세고 그에 따라 행동하는 방법은 없습니다.
Arronical

답변:


13

아니 cut그렇게 할 수 없습니다. 다음 rev과 같은 두 가지 명령을 사용할 수 있습니다

echo 'foo bar baz' | rev | cut -d' ' -f1 | rev

그러나 일반적으로 사용하기가 더 쉽습니다 awk.

echo 'foo bar baz' | awk '{print $(NF)}'

7

셸만 사용하여이 작업을 수행 할 수 있으며 매개 변수 확장을 사용하여 외부 도구가 필요하지 않습니다.

${var##* }

var##*parameter (variable)에서 시작에서 마지막 공간까지 모든 것을 버립니다 var.

구분 기호가 공백 또는 탭과 같은 공백 일 수있는 경우 문자 클래스를 사용하십시오 [:blank:].

${var##*[[:blank:]]}

예:

$ var='foo bar spam egg'

$ echo "${var##* }"
egg


$ var=$'foo\tbar\tspam\tegg'

$ echo "$var"
foo    bar    spam    egg

$ echo "${var##*[[:blank:]]}"
egg

Severus Tux의 답변에 대한 의견에서 매개 변수 확장을 사용하는 것에 대해 이야기했지만 빈 문자 클래스는 유용한 정보입니다.
Arronical

4

나는 개인적으로 Florian Diesch의 답변을 좋아합니다. 그러나이 방법도 있습니다.

a=$(echo "your string here" | wc -w)
echo "your string here" | cut -d' ' -f$a

설명:

wc -w단어 수를 제공합니다. 그리고 cut마지막으로 할 말을 잘라

편집하다:

나는 그것을하는 또 다른 방법을 알아 냈습니다.

echo "Any random string here" | tac -s' ' | head -1

맞습니다. 그러나 공간이 탭이거나 공간이
탭일

좋은 측면 생각이지만 설정 a="my string here"하면 매개 변수 확장 ${a##* }도 사용할 수 있습니다 .
Arronical

1
예, 그러나 OP는 공백으로 구분 된 문자열이 있다고 말했습니다.
Severus Tux

2

여기에 하나를 사용하는 grep

$ echo "Change is Good" | grep -o '[^ ]*$'
Good

작동 방식 :

  • grep with -o일치하는 행의 일치하는 (비어 있지 않은) 부분 만 인쇄하십시오.
  • 정규 표현식 [^ ]*$은 끝에서 공백을 찾을 때까지 모든 항목과 일치합니다.

Perl을 사용 하는 glenn jackman의 또 다른 라이너

$ echo "Change is Good" | perl -lane 'print $F[-1]'
Good
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.