쉘 스크립트를 사용하여 플랫 파일 구문 분석

쉘 스크립트를 사용하여 플랫 파일 구문 분석

다음 형식의 파일이 있습니다

User:blala
Pass:blala
IP:***.***.**.**

IFS를 사용해 보았으나 작동하지 않습니다.

input="/path/to/your/input/file.cvs" 
while IFS=',' read -r f1 f2 f3 f4 f5 f6 f7 
do 
  echo "$f1 $f2 $f3 $f4 $f5 $f6 $f7" 
done < "$input"

쉘 스크립트에서 사용자, 패스, IP 값을 얻고 싶습니다.

도와주세요.

답변1

를 사용하고 싶을 수도 있지만 eval비밀번호에 임의의 문자(코드로 실행될 수 있거나 실행될 예정)가 포함될 수 있으므로 위험이 있습니다. "그렇게 하지 마세요!"
이것은 작동합니다 - 배열을 사용하십시오.

테스트 파일 내용

User:blala
Pass:blala with    spaces: and colons: and $PATH
IP:***.***.**.**

set -f                          # disable globbing
IFS=$'\n'                       # 'word' split only at newline char
value=($(sed 's/:/\n./' file))  # '.' to cater for empty value fields

echo user="${value[1]/./}" 
echo pass="${value[3]/./}" 
echo   ip="${value[5]/./}"

산출:

user=blala
pass=blala with    spaces: and colons: and $PATH
ip=***.***.**.**

답변2

귀하의 질문의 요점을 잘 모르겠습니다.

우선, IFS는 탭, 공백 등과 같은 구분 기호를 포함하는 변수입니다. 기본적으로 공백, 탭 및 줄 바꿈이 포함됩니다.

편집하다:terdon이 제안한 for-loop 에서 -loop로 반복while

while read line
do
        echo $line|cut -d\: -f2
done < /path/to/file.csv

그러면 다음과 같은 출력이 생성됩니다.

blala
blala
***.***.**.**

while 루프를 사용하여 이 작업을 수행할 수도 있습니다. 개인적으로 여기서는 for 루프를 선호합니다.

루프는 무엇을 하고 있나요? 먼저 루프는 file.csv의 첫 번째 줄을 읽고 이를 "line" 변수에 저장합니다.

루프 내에서 $line 변수를 에코하고 평화롭게 분할합니다. file.csv에는 식별자와 값 사이에 항상 ":"가 있기 때문에 구분 기호(-d) ":"로 잘라냈습니다. 필드 표시기(-f)를 사용하여 필드 2(-f2)만 표시하려고 합니다. file.csv에 더 이상 행이 없으면 for 루프가 종료됩니다.

자세한 내용은 cut(1) 매뉴얼 페이지를 참조하십시오.

관련 정보