폴더의 개별 파일에는 다양한 클라이언트에 대한 100개 이상의 방화벽 규칙이 있습니다.
파일 이름이 다음과 같다고 가정합니다.
1.wawa.com_firewall_rule
2.newa.com_firewall_rule
각 파일에는 고객의 IP가 포함되어 있습니다. 나에게 필요한 것은 파일에서 각 고객의 IP를 추출하여 다음 형식으로 단일 새 파일에 추가하는 것입니다.
wawa.com
192.168.1.1
newa.com
8.8.8.8
9.9.9.9
이제 IP를 추출하여 새 파일에 저장할 수 있게 되었습니다. 하지만 모든 것을 하나의 파일에 저장해야 합니다. (보고된 대로) - 아래 코드를 참조하세요.
#!/bin/bash
cd /opt/zeus/zxtm/conf/rules/sba_filter/test
for f in *; do
#echo $f > hosts.txt
grep -E -o "([0-9]{1,3}[\.]){3}[0-9]{1,3}" "$f" > "$f.txt"
done
답변1
직업을 유지하세요. 가능한 해결책은 다음과 같습니다.
#!/bin/bash
cd /home/prova
for f in *; do
basename $f '_firewall_rule' >> output.txt
printf "\n" >> output.txt
grep -E -o "([0-9]{1,3}[\.]){3}[0-9]{1,3}" "$f" | while read -r line ; do
echo $line >> output.txt
printf "\n" >> output.txt
done
done
댓글에서 최적화 기여도 보기
답변2
find your_dir -name "*firewall_rule"
-exec basename {} \;
-exec echo \;
-exec grep -P '(\d{1,3}\.){3}\d{1,3}' {} \;
-exec echo \;
> your_output_file
그러면 (한 줄씩) 다음이 수행됩니다.
- 모든 파일 찾기당신의 디렉토리"firewall_rule"로 끝남
- 빈 줄을 출력하다
- [0-999].[0-999].[0-999].[0-999] IP 주소를 모두 출력합니다.
- 또 다른 빈 줄을 출력
- 출력을 다음 이름의 새 파일로 보냅니다.출력 파일
답변3
명령줄에서 처리할 파일이 많지 않은 경우 awk를 사용하여 단일 명령으로 모든 작업을 수행할 수 있습니다.
awk --posix 'FNR==1 {f=FILENAME; sub("_firewall_rule", "", f); print f "\n"} /([0-9]{1,3}\.){3}[0-9]{1,3}/ {print $0 "\n"}' *_firewall_rule
내 버전에서는 정규식에서 중괄호가 제대로 작동하도록 gawk
해야 합니다 .--posix
어떻게 작동하나요?
새 파일이 시작될 때마다 FNR
파일의 첫 번째 레코드이므로 1이 됩니다. 따라서 FILENAME
내장 변수에서 파일 이름을 가져와 해당 _firewall_rule
부분을 제거하고 나머지 빈 줄을 인쇄합니다.
그런 다음 대략 IPv4 주소와 비슷하게 보이는 줄을 인쇄하고 줄 바꿈 문자를 추가합니다.
IP와 이름 사이에 추가 빈 줄을 모두 원하지 않으면 \n
인쇄 부분을 제거하고 실제로 다음과 같이 패턴 부분을 단순화할 수 있습니다.
awk --posix 'FNR==1 {f=FILENAME; sub("_firewall_rule", "", f); print f} /([0-9]{1,3}\.){3}[0-9]{1,3}/ ' *_firewall_rule