grep 일치 항목을 배열로 저장

grep 일치 항목을 배열로 저장

다음 내용이 포함된 파일이 있습니다.

FILETYPE=A:B:C:D

Linux에서 ksh 스크립트의 배열로 grep검색 A하고 B저장하는 C방법 은 무엇입니까? D나는 노력했다

FILETYPES=`grep "FILETYPE" ${CONF_FILE} | awk -F: '{print $NF}'`

그러나 이것은 마지막 것만 얻습니다.

답변1

GNU/Linux에서는 ksh93 또는 mksh(또는 zshksh 에뮬레이션 모드)를 사용하여 다음을 수행할 수 있습니다.

set -o noglob
filetypes=( $(grep -Po 'FILETYPE=\K.*' < "$CONF_FILE" | tr ':' ' ') )

(기본값으로 가정 $IFS)

또는 좀 더 관용적으로 말하면:

set -o noglob
IFS=:
filetypes=( $(grep -Po 'FILETYPE=\K.*' < "$CONF_FILE"))

배열 이름에는 소문자를 사용하고 있는데, 이는 환경 변수가 일반적으로 대문자이기 때문에 일반적으로 더 안전합니다. 명령의 출력을 배열로 저장하는 방법은 다음과 같습니다.

array=( $(command) )

glob을 비활성화하고 필드 구분 기호를 설정한 후.

그런 다음 명령 자체 grep(여기서는 GNU grep또는 Perl 호환 정규식 지원이 활성화된 것으로 가정( )). 이것이 의미하는 바를 -P알려줍니다.\K"지금까지 일치하는 항목을 모두 삭제합니다.". 줄의 일치하는 부분만 인쇄되도록 하고, 와 함께 사용하면 해당 -o부분만 인쇄됩니다. 마지막으로 기본값에 있는 공백으로 바꿉니다.grep\KA:B:C:Dtr:$IFS

$ printf '%s\n' "${filetypes[0]}"
A
$ printf '%s\n' "${filetypes[3]}" 
D

답변2

짧은 답변:

array=( `grep -Po '(?<=FILETYPE=).*$' $CONFIG_FILE | tr ':' ' '` )

설명: grep은 "FILETYPE=" 뒤에 있는 모든 항목을 반환하기 위해 "look Behind" 어설션을 사용합니다.

결국 배열은 다음과 같이 선언됩니다.

array=(A B C D)

그런 다음 테스트하십시오.

echo "${array[0]} ${array[1]} ${array[2]} ${array[3]}"

인쇄:

A B C D

답변3

또는 :ksh93mksh

{ read -rd=; IFS=: read -rA filetypes; } <file

위 명령은 먼저 입력의 첫 번째 문자를 {...;}읽고 포함합니다 . =입력의 이 부분은 REPLY변수에 저장되며 나중에 어떤 목적으로도 사용되지 않습니다. 그런 다음 코드는 거기에서 이동하여 :-로 구분된 문자열을 배열로 읽습니다 filetypes.

-din 옵션을 사용하면 명령이 주어진 문자(개행 문자 대신)를 읽습니다 read. 이 명령에 대한 ksh옵션을 사용하면 -A문자열 변수 대신 인덱스 배열을 읽을 수 있습니다. 를 사용하면 -A변수 값이 IFS입력의 배열 요소를 분할하는 데 사용됩니다.

시험:

$ cat file
FILETYPE=A:B:C:D
$ { read -rd=; IFS=: read -rA filetypes; } <file
$ printf '"%s"\n' "${filetypes[@]}"
"A"
"B"
"C"
"D"

-A로 변경하면 -a코드가 bash.


파일에 읽고 싶지 않은 추가 줄이 포함되어 있으면 ksh93다음을 사용하십시오 .

grep '^FILETYPE=' file | { read -rd=; IFS=: read -rA filetypes; }

쉘 옵션이 설정되어 있고 코드가 작업 제어가 비활성화된(그리고 위에 설명된 대로 변경된) 비대화형 쉘(예: 스크립트)에서 실행되지 않는 한 mkshNor에서는 작동하지 않습니다 .bashlastpipe-A-a

관련 정보