다음 형식의 파일이 있습니다
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) 매뉴얼 페이지를 참조하십시오.