awk substr을 사용하여 마지막 필드 가져 오기
다음과 같은 간단한 요구 사항이 있습니다
. 절대 디렉토리로 파일 이름을 얻습니다.
예를 들어 /home/parent/child/filename
내 요구 사항은 여기에서 파일 이름을 잘라내는 것입니다.
내가 시도한 것은 :
awk -F "/" '{print $5}' input
완벽하게 작동합니다.
그러나 여기에 $5
내 입력이 다음과 같은 구조를 갖는 경우 다를 수있는 하드 코딩 이 있습니다.
/home/parent/child1/child2/filename
따라서 하드 코딩없이 동적이어야합니다. 논리는 다음과 같습니다.
항상 파일 이름이 될 마지막 필드를 가져옵니다 (따라서 반대로 확인해야 함).
누구든지 awk substr 함수 나 다른 함수로 나를 도울 수 있습니까?
awk
정의 할 수있는 필드 구분 기호를 기반으로 필드의 행 을 분할 하는 사실을 사용하십시오 . 따라서 필드 구분 기호를 정의하면 /
다음과 같이 말할 수 있습니다.
awk -F "/" '{print $NF}' input
NF
현재 레코드의 필드 수 를 나타내는 것처럼 $NF
인쇄는 마지막 레코드를 인쇄 하는 것을 의미합니다.
따라서 다음과 같은 파일이 주어집니다.
/home/parent/child1/child2/child3/filename
/home/parent/child1/child2/filename
/home/parent/child1/filename
다음과 같이 출력됩니다.
$ awk -F"/" '{print $NF}' file
filename
filename
filename
이 경우 다음 basename
대신 사용하는 것이 좋습니다 awk
.
$ basename /home/parent/child1/child2/filename
filename
또 다른 옵션은 bash
매개 변수 대체 를 사용하는 것 입니다.
$ foo="/home/parent/child/filename"
$ echo ${foo##*/}
filename
$ foo="/home/parent/child/child2/filename"
$ echo ${foo##*/}
filename
Perl 솔루션에 열려있는 경우 여기에 fedorqui의 awk 솔루션과 유사한 솔루션이 있습니다.
perl -F/ -lane 'print $F[-1]' input
-F/
지정 /
필드 분리 그대로
$F[-1]
마지막 요소 @F
자동 구분 어레이
basename 답변에 대한 주석이어야하지만 요점이 충분하지 않습니다.
큰 따옴표를 사용하지 않으면 basename
공백 문자가있는 경로에서 작동하지 않습니다.
$ basename /home/foo/bar foo/bar.png
bar
좋아 따옴표 ""
$ basename "/home/foo/bar foo/bar.png"
bar.png
파일 예
$ cat a
/home/parent/child 1/child 2/child 3/filename1
/home/parent/child 1/child2/filename2
/home/parent/child1/filename3
$ while read b ; do basename "$b" ; done < a
filename1
filename2
filename3
I know I'm like 3 years late on this but.... you should consider parameter expansion, it's built-in and faster.
if your input is in a var, let's say, $var1, just do ${var1##*/}
. Look below
$ var1='/home/parent/child1/filename'
$ echo ${var1##*/}
filename
$ var1='/home/parent/child1/child2/filename'
$ echo ${var1##*/}
filename
$ var1='/home/parent/child1/child2/child3/filename'
$ echo ${var1##*/}
filename
Like 5 years late, I know, thanks for all the proposals, I used to do this the following way:
$ echo /home/parent/child1/child2/filename | rev | cut -d '/' -f1 | rev
filename
Glad to notice there are better manners
You can also use:
sed -n 's/.*\/\([^\/]\{1,\}\)$/\1/p'
or
sed -n 's/.*\/\([^\/]*\)$/\1/p'
참고URL : https://stackoverflow.com/questions/17921544/get-last-field-using-awk-substr
'Program Tip' 카테고리의 다른 글
SQL Server의 테이블 및 인덱스 크기 (0) | 2020.10.06 |
---|---|
WPF에서 Application.DoEvents ()는 어디에 있습니까? (0) | 2020.10.06 |
JSON의 유효성을 검사하는 정규식 (0) | 2020.10.06 |
devise의 sign_in 작업에 대한 다른 레이아웃 (0) | 2020.10.06 |
C #에서 ping 사용 (0) | 2020.10.06 |