Linux bash awk는 특수 문자로 단어를 인쇄합니다.

Linux bash awk는 특수 문자로 단어를 인쇄합니다.

URL이 있습니다:

www.google.com/word/word1/word_2/word3/word4

_awk를 사용하여 특수 문자가 포함된 단어 만 인쇄하고 싶습니다 . 때로는 폴더 계층 구조가 변경될 수 있습니다.

www.google.com/word/word1/word2/word3/word_4

저는 이것을 사용하고 있는데 가끔 폴더가 위에 있을 때가 있습니다 $6.

folder=$(echo "$url" | awk -F/ '{print $6}')

/문자 사이에 폴더 이름을 인쇄 해야 합니다 .

답변1

이와 같은 것이 작동합니다. 아마도 더 효율적인 방법이 있을 것입니다.

echo 'www.google.com/word/word1/word2/word3/word_4' | awk -F'/' '{for(i=2;i<=NF;i++){if($i~/_/){print $i}}}'
word_4

모든 필드를 반복하고 단어에 밑줄이 포함되어 있는지 확인하면 해당 단어를 인쇄합니다. 2부터 도메인 이름은 변경되지 않은 것으로 가정합니다.

비반복적 접근 방식에 대한 아이디어:

$ echo 'www.google.com/word/word1/word_2/word3/word4' | awk '{print gensub(/^.*\/([^/]+_[^/]*).*/,"\\1","1")}'
word_2

awk가 필요하지 않은 경우 더 우아한 솔루션은 다음과 같습니다.

$ echo 'www.google.com/word/word1/word_2/word3/word4' | grep -oE '[^/]+_[^/]*'
word_2

답변2

간단한 해결책은 다음과 같습니다.

% echo 'www.google.com/word/word1/word_2/word3/word4' | tr -s '/' '\n'  |grep _
word_2

즉, 슬래시를 개행으로 변경한 다음 밑줄이 포함된 결과 줄을 인쇄합니다.

슬래시 이외의 다른 문자를 단어 구분 기호로 간주해야 하는 경우 첫 번째 인용 문자열에 포함시키세요. 또는 반대 방법으로 단어의 일부가 될 수 있는 모든 항목을 나열합니다.

% echo 'www.google.com/word/word1/word_2/word3/word4' | tr -sc 'a-zA-Z_0-9' '\n'  |grep _
word_2

답변3

zsh대신 을 사용하면 다음 을 포함하는 분리된 단어를 bash추출할 수 있습니다 ./_

words=( ${(M)${(s[/])url}:#*_*} )

이는 해당 단어에 포함된 바이트 값에 관계없이 작동하며 프로세스를 포크하거나 외부 유틸리티를 실행하는 것과 관련이 없습니다.

${(s[/])url} s변수를 /패턴과 일치하는 배열의 ${(M)array:#pattern}요소 로 .expands로 분할합니다.M

에서도 할 수 있지만 bash더 번거롭습니다.

words=()
IFS=/; set -o noglob
for word in $url; do
  if [[ $word = *_* ]]; then
    words+=( "$word" )
  done
done

awkperl일부 텍스트 스트림/파일에서 한 줄에 하나씩 긴 URL 목록이 있는 경우 /가 더 적합합니다.

그리고 perl:

that-stream | perl -F/ -lae 'print for grep /_/, @F'

관련 정보