[linux] ‘cut’을 사용하여 마지막 필드를 찾는 방법

없이 사용 sed하거나 awk, 전용 cut 필드의 수는 모든 라인에 알 수없는하거나 변경할 때, 어떻게 마지막 필드를받을 수 있나요?



답변

다음과 같이 시도해보십시오.

echo 'maps.google.com' | rev | cut -d'.' -f 1 | rev

설명

  • rev “maps.google.com”을 반대로 moc.elgoog.spam
  • cut 점 (예 : ‘.’)을 구분 기호로 사용하고 첫 번째 필드를 선택합니다. moc
  • 마지막으로 다시 뒤집기 위해 com

답변

매개 변수 확장을 사용하십시오. 이것은 훨씬 더 효율적 어떤 외부 명령의 종류보다 cut(또는 grep포함).

data=foo,bar,baz,qux
last=${data##*,}

bash의 기본 문자열 조작에 대한 소개는 BashFAQ # 100 을 참조하십시오 .


답변

를 사용하는 것은 불가능합니다 cut. 사용하는 방법은 다음과 같습니다 grep.

grep -o '[^,]*$'

다른 분리 문자의 경우 쉼표를 바꾸십시오.


답변

awk없이? … 그러나 awk로 너무 간단합니다.

echo 'maps.google.com' | awk -F. '{print $NF}'

AWK는 주머니에 더 강력한 도구입니다. 필드 구분 기호 NF가 필드 수인 경우 -F (마지막 인덱스도 나타냄)


답변

여러 가지 방법이 있습니다. 이것도 사용할 수 있습니다.

echo "Your string here"| tr ' ' '\n' | tail -n1
> here

분명히 tr 명령의 공백 입력은 필요한 구분 기호로 바꿔야합니다.


답변

이것은 컷 이외의 것을 사용할 수있는 유일한 솔루션입니다.

에코 “문자열”| 컷 -d ‘.’ -f2-
[repeat_following_part_forever_or_until_out_of_memory :] | 컷 -d ‘.’ -f2-

이 솔루션을 사용하면 실제로 필드 수를 알 수 없으며 때때로 달라질 수 있습니다. 그러나 줄 길이는 개행 문자를 포함하여 LINE_MAX 문자 또는 필드를 초과해서는 안되므로 임의의 수의 필드를이 솔루션의 실제 조건으로 포함 할 수 없습니다.

예, 매우 바보 같은 솔루션이지만 내가 생각하는 기준을 충족시키는 유일한 솔루션입니다.


답변

입력 문자열에 슬래시가 포함되어 있지 않으면 basename서브 쉘을 사용할 수 있습니다 .

$ basename "$(echo 'maps.google.com' | tr '.' '/')"

이것은 사용하지 않는 sedawk뿐만 아니라 사용하지 않는 cut내가 확신 그것의 말로으로 질문에 대한 답변으로 자격이 있는지 아니에요, 그래서 하나.

슬래시를 포함 할 수있는 입력 문자열을 처리하는 경우에는 제대로 작동하지 않습니다. 이 상황에 대한 해결 방법은 슬래시를 유효한 입력 문자열의 일부가 아닌 다른 문자로 바꾸는 것입니다. 예를 들어 파이프 ( |) 문자는 파일 이름에 사용할 수 없으므로 다음과 같이 작동합니다.

$ basename "$(echo 'maps.google.com/some/url/things' | tr '/' '|' | tr '.' '/')" | tr '|' '/'