여러 파일의 데이터를 줄로 구분하여 새 파일에 추가합니다.

여러 파일의 데이터를 줄로 구분하여 새 파일에 추가합니다.

폴더의 개별 파일에는 다양한 클라이언트에 대한 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

관련 정보