
フォルダ内の個々のファイルには、さまざまなクライアント用の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を抽出して新しいファイルに保存できるようになりました。ただし、すべてを1つのファイルに保存する必要があります。 (報告されているように) - 以下のコードを参照してください。
#!/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
これにより(1行ずつ)、次のようになります。
- すべてのファイルを検索あなたのディレクトリ「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