bash 스크립트에서 탭으로 구분 된 파일을 반복


18

여기까지 내가 가진 것입니다 :

#!/bin/bash
while read line; do
        DB=$(echo $line | cut -f1)
        USER=$(echo $line | cut -f2)
        PASS=$(echo $line | cut -f3)
        echo DB=$DB USER=$USER PASS=$PASS
done < users.txt

입력 파일의 샘플 :

drupal_1    drupal1 tmmjXSWL
drupal_2    drupal2 FHiJSYHM
drupal_3    drupal3 b7bFNj06
drupal_4    drupal4 0AaV62EL

그리고 스크립트에서 출력 :

DB=drupal_1 drupal1 tmmjXSWL USER=drupal_1 drupal1 tmmjXSWL PASS=drupal_1 drupal1 tmmjXSWL
DB=drupal_2 drupal2 FHiJSYHM USER=drupal_2 drupal2 FHiJSYHM PASS=drupal_2 drupal2 FHiJSYHM
DB=drupal_3 drupal3 b7bFNj06 USER=drupal_3 drupal3 b7bFNj06 PASS=drupal_3 drupal3 b7bFNj06

어떤 이유로 각 변수는 전체 줄로 설정됩니다. echo users.txt | cut -f1명령 줄에서 사용 하면 토큰이 정상적으로 반환됩니다.

답변:


6

이건 어때?

$ awk '{print "DB="$1"\tUSER="$2"\tPASS="$3}' users.txt
DB=drupal_1 USER=drupal1    PASS=tmmjXSWL
DB=drupal_2 USER=drupal2    PASS=FHiJSYHM
DB=drupal_3 USER=drupal3    PASS=b7bFNj06
DB=drupal_4 USER=drupal4    PASS=0AaV62EL

해결해야 할 문제가 있는지 또는 더 이론적 인 문제가 있는지 궁금합니다.


고마워요. 내가 가르치는 수업을 위해 서버에 40 개 이상의 Drupal 설치를 작성하는 스크립트를 작성하려고합니다. DB와 파일을 설정하는 스크립트가 있습니다.이 스크립트는 모두 통합 할 스크립트입니다. 내 코드의 문제는 $ line이 탭을 구문 분석 할 때 공백으로 바꾼다는 것입니다. $(echo $line | cut -d" " -f1)작동합니다.
mortona42

필드에 공백이 포함되어 있으면 실패합니다
v01pe

21

문제는 명령에 echo $line있습니다. 주위 $line에 따옴표가 없으므로 쉘은 단어 분리를 수행 한 다음 각 단어를 글 로빙 패턴으로 해석합니다. 함께 사용해보십시오

a='*.txt foo'
ls $a

귀하의 경우 탭은 단어를 분리 한 다음에 대한 별도의 인수가됩니다 echo. 이 echo명령은 인수를 공백으로 구분하여 인쇄합니다. 따라서 cut탭으로 구분 된 필드 대신 공백으로 구분 된 필드를받습니다.

변수 대체 $foo와 명령 대체를 항상 큰 따옴표로 묶으십시오$(foo) (이유를 생략해야하는 이유와 그렇게하는 것이 좋은 이유를 이해하지 않는 한). echo "$line"여기에서 작동하지만 제안한 작업을 수행하는 복잡한 방법입니다.

쉘에서 구문 분석하는 방식을 유지하면서 read명령을 입력을 필드로 구문 분석 할 수 있습니다.

while read DB USER PASS; do
  echo "DB=$DB USER=$USER PASS=$PASS"
done <users.txt

readIFS변수 의 값에서 필드를 문자로 구분 하여 공백과 탭으로 구성합니다 (줄 안에는 줄 바꿈이 없음). 탭에서만 분할하려면 IFS먼저 단일 탭으로 설정 하십시오. 선행 및 후행 탭은 무시되고 연속 탭은 단일 탭으로 계산됩니다.

read\특수 문자로 취급합니다 . 백 슬래시 다음에 줄 바꿈이 무시됩니다. \\단일 백 슬래시가됩니다. 이 동작을 피하려면 -r옵션을 전달하십시오 .


15
+1. bash에서 IFS를 탭 문자로 설정하려면 :IFS=$'\t'
glenn jackman
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.