2017-03-02 4 views
-1

여기 일부 목표를 달성하기 위해 노력하고 있습니다. 부분적인 단계를 알고있는 동안, 나는 그것을 모두 합치는데 성공하지 못했습니다. 여러 호스트에서 한 번만 사용하도록 인라인 명령을 찾고 있습니다. 의이 같은 조직 SW 저장소 파일을 보자 :bash에서 파일을 구문 분석하는 방법

이제
# comments 
PROD_NAME:INSTALL_DIR:OPTIONS 
PROD_NAME:INSTALL_DIR:OPTIONS 
PROD_NAME:INSTALL_DIR:OPTIONS 

,의 우리가 파일을 처리하고 제품 하나 하나에 약간의 복사 동작을 수행 할 가정 해 봅시다. 그래서 grepwhile do주기에 주석 줄을 없애고, 여기서 awk을 사용하여 각 줄을 제품 이름으로 구분하고 경로를 복사 명령으로 완성 할 수 있습니다. 그리고 그것은 내 기술 수준에 너무 많이 중첩되어 있습니다. 나는 두려워합니다. 누가 공유하고 싶습니까?

awk -f: '{print $1, $2, $3}' 

공예 복사하려면 당신이 파이프에 쉘 결과가 명령 :

+0

스크립트의 예상 출력에 대한 세부 정보를 제공하십시오. 스크립트는 무엇을할까요? 특정 답변을 얻으려면 구체적이어야합니다. 또한 "bash는 파일에서 행을 읽습니다"또는 "bash는 파일에서 행을 나누어줍니다"와 같이 자신 만의 조사를 할 수 있습니다 –

+0

죄송합니다. 스크립트는 예를 들어 저장소 파일의 각 주석 처리되지 않은 행에 대해'cp INSTALL_DIR INSTALL_DIR/PROD_NAME' (실생활은 더 복잡하지만 괜찮습니다). – Ren

+0

이것이 작동하는 동안'echo $ line | gawk -F '[:]' '{print $ 2}' ', 이렇게하지 않습니다 :'while read line; echo $ line | gawk -F '[:]' '{print $ 2}'; 완료 | grep [#]/var/opt/repo' – Ren

답변

1

당신은 주어진 실행하기 위해 동일한

$ while IFS=: read -r p i o; 
    do echo "cp $o $p $i"; 
    done < <(grep -v '^#' file) 

cp OPTIONS PROD_NAME INSTALL_DIR 
cp OPTIONS PROD_NAME INSTALL_DIR 
cp OPTIONS PROD_NAME INSTALL_DIR 

제거 에코을 할 수있는 bash 루프를 사용할 수 있습니다.

+0

네, 여기에 'read line while'이라는 어딘가에 있습니다. do'echo $ line | gawk -F '[#]' '{print $ 3}' '; 완료 | grep [#]/var/opt/repo'하지만 여전히 누락 된 부분을 알아낼 수는 없으며, 혼자서도 작동하지만 부분적으로는 줄을 읽거나 끊을 수 없습니다. – Ren

+0

스크립트가 게시 한 입력 파일과 일치하지 않습니다. 게시 한 입력 파일을 테스트 했습니까? 필드 분리 문자는':'아니고'# '입니다. – karakfa

+0

죄송 합니다만, 그렇지 않습니다. 나는 다양한 옵션을 시도하여 다소 혼란스러워하고 다른 명령을 게시했습니다. 그러나 여러분의 예제가 작동하고 awk 없이도 묻고있는 예제를 정확히 수행했음을 알았습니다. 감사합니다. 빠르고 쉽습니다. 복잡한 명령을 완료하기 위해이 명령을 변경하려고합니다. – Ren

0

댓글은 필드 구분 기호를 지정해야 AWK를 들어

grep -v '^#' 

제거 할 수 있습니다.

echo -e '# comments\nNAME:DIR:OPT' | 
grep -v '^#' | 
awk -F: '{print "cp", $3, $2, $1}' | 
sh 

더 좋은 : 책을 읽으십시오.

또는이 :

+0

위와 같이 감사합니다. 나는이 부분적인 단계를 알고 있지만 함께 모으는 방법을 알아낼 수는 없다. – Ren

관련 문제