구분 기호와 공백으로 구분된 파일의 각 줄을 읽는 방법

구분 기호와 공백으로 구분된 파일의 각 줄을 읽는 방법

나는 텍스트 파일에서 일부 값을 가져오고 이를 for 루프에 넣어 변수로 사용하는 작은 쉘 스크립트를 작성했습니다. 이를 wsadmin 명령에 대한 입력으로 사용할 것입니다. 아래는 제가 작성한 쉘 스크립트입니다.

FILE=`cat test.txt`

for i in `echo "$FILE"`

do
DS_NAME=`echo "$i"|awk -F"=" '{print $2}'`
HOST_NAME=`echo "$i"|awk -F"=" '{print $2}'`
PORT_NUMBER=`echo "$i"|awk -F"=" '{print $3}'`
DB_NAME=`echo "$i"|awk -F"=" '{print $4}'`

echo "$DS_NAME"

echo "$HOST_NAME"

echo "$PORT_NUMBER"

echo "$DB_NAME"

done

내 test.txt 파일의 내용은 다음과 같습니다.

test connection data source=test.connect.com=1234=testdb
test connection data source=test1.connect.com=1134=test1db
test connection data source=test2.connect.com=1234=test2db

쉘 스크립트를 실행하면 아래와 같은 출력을 찾고 있습니다.

test connection data source
test1.connect.com
1234
testdb

하지만 안타깝게도 필요한 것을 얻지 못했습니다. 이는 DS_NAME의 단어 사이에 공백이 있기 때문이라고 생각합니다. 이 문제를 어떻게 해결할 수 있나요? 어떤 제안이라도 부탁드립니다.

답변1

FILE=`cat test.txt`파일의 내용(후행 개행 제외)을 변수에 저장합니다 FILE. 그런 다음 echo "$FILE"파일 내용을 인쇄합니다(대시로 시작하지 않고 백슬래시를 포함하지 않는다고 가정). 직접 작성하는 것이 더 쉬울 것입니다.

for i in `cat test.txt`

다음으로, 단어 분리를 허용하는 컨텍스트 내 명령 대체는 `…`명령 출력을 줄이 아닌 단어로 나눕니다. (이것은 기본값이며 변경될 수 있지만 문제를 해결하는 가장 좋은 방법은 아닙니다.) 볼 수 있는 문제는 다음과 같습니다. 루프는 각 줄에 대해 한 번 실행되는 것이 아니라 각 단어에 대해 한 번 실행됩니다. 또한 이러한 단어는 쉘 와일드카드 패턴으로 처리됩니다. test * source=a=b=c다음 과 같은 줄이 있으면 *현재 디렉터리의 파일 이름 목록으로 대체됩니다.

awk를 사용하여 행에서 필드를 추출하는 것은 작동하지만(의 손상 제외 echo) 지나치게 복잡하고 느립니다.

한 줄을 읽고 이를 필드로 분할할 수 있는 셸 내장 함수가 있습니다.read. 그냥 그걸 사용하세요. 문자를 필드 구분 기호로 사용하려면 명령의 =변수를 설정하십시오. 줄 끝의 백슬래시를 연속된 줄을 나타내는 것으로 처리하지 않으려면 이 옵션을 전달하십시오.IFSread-rread

while IFS='=' read -r DS_NAME HOST_NAME PORT_NUMBER DB_NAME ignored; do
done <test.txt

추가 변수는 ignored추가 필드가 있는 경우 파서를 더욱 강력하게 만듭니다.

test connection data source=test.connect.com=1234=testdb=hey, a new field

관련 정보