2013-04-19 7 views
1

변수에 여러 개의 IP 주소가 있습니다. 변수를 파일에 저장하는 중 새줄 - bash

ActiveIPs=192.168.0.1 192.168.0.2 192.168.0.3 

나는 줄 바꿈 내가이 어떻게해야합니까

192.168.0.1 
192.168.0.2 
192.168.0.3 

로 구분이 같은 파일에 저장하려면?

+2

오타가 있어야합니다. 그 확장의 첫 번째 문자는 따옴표로 묶지 않는 한 공간이 될 수 없습니다. – kojiro

+0

오른쪽, 고맙습니다 – user2266492

+2

여전히 전체 문자열을 인용해야합니다. 그렇지 않으면, 두 번째 토큰의 어떤 것도 * command *로 해석됩니다 (적어도 bash 3.2.48에서는). – mklement0

답변

0

어쩌면 너무 기본,하지만이 작동합니다

echo "ActiveIPs= 192.168.0.1 192.168.0.2 192.168.0.3" | cut -d= -f2 | awk '{for (i=1;i<=NF;i++) print $i}' 

출력 :

192.168.0.1                                                                  
192.168.0.2                                                                  
192.168.0.3 

모두 사람 : awk의 각 필드 사이에 새로운 라인을 인쇄 할 수있는 더 좋은 방법은 무엇입니까? OFS='\n'으로 시도했지만 작동하지 않았습니다.

+0

질문에 답하려면'echo "ActiveIPs = 192.168.0.1 192.168.0.2 192.168.0.3"| awk 'NR> 1'RS = '''하지만 ActiveIP가 텍스트에 포함되어 있다고 생각하지 않습니다. 변수 이름이 제 대답을 참조하십시오. –

+0

아, RS에 대해서 몰랐어. 나는 그것의 목적이'OF'에 의해 행해졌다고 생각했다 (그들의 차이점은 무엇인가?). 또한 : 이제'ActiveIPs = ...'에 대한 당신의 요지를 보았습니다. 나는 그것이 전체 문자열이라고 생각했습니다. 대답에 +1, @ sudo_O. – fedorqui

+0

필드는 레코드로 구성되고, 레코드는 필드로 구성되며, awk는 레코드를 반복합니다 (기본적으로 레코드는 개행입니다). 레코드가'awk' 인 것을 정의함으로써 반복을 할 것이므로 그렇게하지 않아도됩니다. 'OFS'설정이 http://backreference.org/2010/02/10/idiomatic-awk/ 특별히 자체 할당 섹션에서 작동하지 않는 이유를 이해하려면 –

1

printf은 필요에 따라 패턴을 반복합니다.

ActiveIPs="192.168.0.1 192.168.0.2 192.168.0.3" 
printf "%s\n" $ActiveIPs > file.txt 
+1

나는 파이프 라인이나 외부 명령을 포함하지 않는 모든 대답에 +1을주고있다. – kojiro

+0

이것은 특정 입력 값에 대한 훌륭한 솔루션이지만 일반적으로 사용하기에는 까다 롭습니다. 솔루션은 쉘에 의해 * 확장 * 될 수있는 값에 의존하기 때문에 원하지 않는 부작용이 발생할 수 있습니다. – mklement0

0

주 - 즉시 \ 히트 NEWLINE- 후 :

$ foo='abc def ghi' 
$ echo "${foo// /$'\n'}" 
abc 
def 
ghi 

매개 변수 확장을 사용 :

echo $ActiveIPs | sed 's/ /\ 
/g' 
+2

다음은'$ '\ n "'리터럴을 사용하는 단일 행 버전입니다 :'echo $ ActiveIPs | sed 's// \'$ '\ n "'/ g" – mklement0

1
for ip in $ActiveIPs; do 
    echo $ip >> file 
done 
+0

+1 외부 명령과 파이프를 피하는 방법! – kojiro

+3

(각 줄을 따로 따로 추가하는 것보다 루프의 끝에'> file'을 한 번 쓰는 것이 더 효율적이지만) – kojiro

1

는 줄 바꿈 모든 공백 문자를 변경하기 위해 매개 변수 확장을 사용하여 내장 된 명령조차도 아닌 새로운 프로세스를 만드는 것을 피합니다.

당신이 할 수있는 경우에, 당신은 배열에 값을 저장 더 나을 것 :

$ input=(192.168.0.100 10.0.0.1 192.168.0.101) 

이 방법, 당신은 쉘이 단어를 분할하는 방법을 완벽하게 제어 할 수 있습니다, 당신은 여전히이 없습니다 외부 명령을 호출합니다.

$ SAVE_IFS="$IFS" 
$ IFS=$'\n' 
$ echo "${input[*]}" 
192.168.0.100 
10.0.0.1 
192.168.0.101 
2
$ ActiveIPs="192.168.0.1 192.168.0.2 192.168.0.3" 

$ awk '1' RS=' ' <<< "$ActiveIPs" 
192.168.0.1 
192.168.0.2 
192.168.0.3 
+0

Nice; 'RS'(입력 레코드 분리 자) 기술은 알아두면 좋습니다. 한가지주의 할 사항 :'<<<'을 사용하면 출력에 추가로'\ n'이 추가됩니다. 이를 피하기 위해서는'printf "$ ActiveIPs"| awk '1'RS = '''. – mklement0

관련 문제