여러 파일을 단일 마스터 파일과 비교하여 별도의 파일에 저장하고 싶고 상태 열이 변경되었거나 변경되지 않은 호스트 이름을 언급하는 csv 파일도 원합니다. 급한 일이 있어요. 여기에 도움이 필요합니다. 감사해요.
아래는 내 재고 파일입니다.
cat inventory
[routers]
iLAB-SR-12-R2 ansible_host=192.168.82.211
iLAB-SR-12-R3 ansible_host=192.168.82.212
iLAB-SR-12-R4 ansible_host=192.168.82.213
아래는 내 스크립트입니다.
#!/bin/bash
config_location="/etc/ansible/backups"
master="/etc/ansible/master.txt"
cd $config_location
file=`ls -l | grep "^-" | awk '{print $NF}'`
for i in $file
do
diff -c $i $master > "/etc/ansible/difference/diff_$i"
done
위는 여러 파일을 단일 파일로 비교하고 다른 파일 이름으로 다른 위치에 저장하는 스크립트입니다. 이제 클라이언트는 모든 파일을 보고 싶지 않고 파일에 차이점이 있는지 확인하고 싶다고 말합니다. 그래서 그들은 호스트 이름과 설명이 포함된 일부 csv 파일을 요청합니다. 전임자:
Hostname comments
host1 no changes
host2 changes
변경됨과 변경되지 않음은 차이 비교에 따라 달라지며, 차이가 있으면 변경되었음을 의미하고, 차이가 없으면 변경되지 않음을 의미합니다. 주석이 변경 사항으로만 표시되면 클라이언트는 파일을 확인합니다.
답변1
파일 이름이 언급한 호스트 이름과 관련이 있다고 가정하면 for
루프에서 다음을 수행할 수 있습니다.
...
for i in $file
do
if diff -c $i $master > "/etc/ansible/difference/diff_$i" ;then
echo "$i is the same as $master"
else
echo "$i is different from $master"
fi
done
diff
파일이 동일하면 성공적으로 종료(상태 = 0)되고 파일이 다르면 종료 실패(상태 = 1)되므로 이를 사용하여 if-else-fi
위의 내용을 확인할 수 있습니다. 이 코드는 잘못된 것이 없다고 가정합니다. 즉, 다른 오류가 발생했는지 확인하지 않습니다.
프로그램에서 인쇄한 메시지를 csv 메시지로 쉽게 변경하고 출력을 다음과 같은 파일로 리디렉션할 수 있습니다.
...
echo "Hostname, comments" > output.csv
for i in $file
do
if diff -c $i $master > "/etc/ansible/difference/diff_$i" ;then
echo "$i, no change"
else
echo "$i, some change"
fi
done >> output.csv