AWK를 사용하지 않고 문자열의 마지막 열 가져오기

AWK를 사용하지 않고 문자열의 마지막 열 가져오기

sed와 동일한 것을 제공하기 위해 or ( 플래그 grep없이 ) 를 사용할 수 있는지 궁금합니다 .-Pawk '{print $6}'

iOS용 스크립트를 만들고 있지만 타사 명령(예: )을 설치하고 싶지 않습니다 awk.

  • grep이 플래그는 iOS에서도 지원되지 않으므로 -P지원되지 않습니다 perl-regexp.
  • cutiOS의 타사 명령입니다(따라서 아니요 cut).

답변1

문자열이 있는 경우바꾸다스크립트에서 (질문 제목에서 말했듯이) 마지막 필드를 추출하려는 경우 다음을 수행할 수 있습니다.

field=${string##* }

이는 문자열이 $string공백으로 구분되어 있다고 가정합니다(위의 변수 대체에서 공백을 사용하는 구분 기호로 변경). 변수 대체는 ${variable##pattern}주어진 것과 일치하는 가장 긴 접두사 문자열을 제거합니다.$variablepattern

파일 의 경우 sed다음은 각 줄의 공백으로 구분된 마지막 필드를 추출합니다.

sed 's/^.*[[:space:]]//' data.in

마지막 공백 문자를 포함하여 각 줄의 모든 항목을 제거하여 이를 수행합니다. [[:space:]]데이터에서 탭이나 공백을 구분 기호로 사용하지 않는 경우 마지막 열 앞의 구분 기호와 일치하는 정규식으로 변경하세요.

답변2

grep옵션을 사용할 수 있다고 가정하고 를 사용하십시오 -o(또한 특정 열뿐만 아니라 마지막 열의 제목을 요구함으로써).

$ echo 'foo bar 123' | grep -o '[^ ]*$'
123
$ echo 'foo;bar;123' | grep -o '[^;]*$'
123

답변3

POSIX 호환 마지막 공백으로 구분된 열 sed(동등 awk '{print $NF}')을 가져오고 입력이 유효한 텍스트라고 가정하려면 다음을 수행하세요.

sed 's/[[:blank:]]*$//; # remove trailing blanks
     s/.*[[:blank:]]//; # remove every thing up to the last blank
    ' < file

대부분의 awk구현에서는 필드를 공백(가로 간격)으로 구분하지만 일부(예: busybox ) 는 로케일 방법에 관계없이 awk모든 공백( )으로 구분 하고 일부는 ASCII 공백(공백 및 탭)으로만 구분합니다. Microsoft 운영 체제의 파일의 경우 뒤따르는 CR 문자를 공백으로 처리하고 삭제하도록 바꿔야 [[:space:]]할 수도 있습니다 .[[:blank:]][[:space:]]

여섯 번째 필드를 얻으려면( 와 동일 awk '{print $6}'):

s='[[:blank:]]' S='[^[:blank:]]'
sed "s/^$s*\($S\{1,\}$s\{1,\}\)\{5\}\($S\{1,\}\).*/\2/; t
     s/.*//; # flush the line if does not have 6 fields"

다음 방법을 사용할 수도 있습니다.

sed 's/[^[:blank:]]\{1,\}/\
&\
/6; s/.*\n\(.*\)\n.*/\1/;t
s/.*//'

답변4

마지막 열을 인쇄하기 위해 sed 명령을 사용하여 공백 구분 기호로 다음 상황을 테스트했는데 잘 작동합니다.

input.txt

praveen ajay abhi

방법 1

echo "praveen ajay abhi"| sed -r "s/.* //g"

산출

아비

관련 정보