複数のファイルのデータを行で区切って新しいファイルに追加します。

複数のファイルのデータを行で区切って新しいファイルに追加します。

フォルダ内の個々のファイルには、さまざまなクライアント用の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

関連情報