データ処理-2

参考書籍 : 実践bashによるサイバーセキュリティ対策



XMLの処理
次のxmlに対して処理を行う
book.xml

<book title="Cybersecurity Ops with bash" edition="1">
  <author>
    <firstName>Paul</firstName>
    <lastName>Troncone</lastName>
  </author>
  <author>
    <firstName>Carl</firstName>
    <lastName>Albing</lastName>
  </author>
</book>

firstNameという要素をすべて取り出すには、grepを使う

$ grep -o '<firstName>.*<\/firstName>' book.xml
<firstName>Paul</firstName>
<firstName>Carl</firstName>

この場合だと、1行の要素しか抽出できない。
複数行にまたがる要素を抽出するには、次にようにする。

$ grep -Pzo '(?s)<author>.*?<\/author>' book.xml
<author>
    <firstName>Paul</firstName>
    <lastName>Troncone</lastName>
  </author><author>
    <firstName>Carl</firstName>
    <lastName>Albing</lastName>
  </author>

(?s)はPerl固有のパターンマッチ修飾子であり、メタ文字.が改行文字にもマッチするようになる。
XMLのタグを削除するには、出力をsedにパイプする。

$ grep -Po '<firstName>.*?<\/firstName>' book.xml | sed 's/<[^>]*>//g'
Paul
Carl

sed s/expr/other/により、exprをotherに置換する。exprには正規表現で<[^>]*>を指定し、otherには何も指定しない。
正規表現<[^>]*>は、先頭が<から始まり、[^>]*で>以外の0文字以上の文字列にマッチし、>で終了する。



JSONの処理
次のJSONに対して処理を行う

{
  "title": "Cybersecurity Ops with bash",
  "edition": 1,
  "authors": [
    {
      "firstName": "Paul",
      "lastName": "Troncone"
    },
    {
      "firstName": "Carl",
      "lastName": "Albing"
    }
  ]
}

grepでkey/valueを抽出するには、次のようにする。

$ grep -o '"firstName": ".*"' book.json
"firstName": "Paul"
"firstName": "Carl"

keyを除外し、valueだけを表示するときは、出力をcutにパイプする。

$ grep -o '"firstName": ".*"' book.json | cut -d " " -f2 | tr -d '"'
Paul
Carl

 


・データの集約
たくさんのデータファイルから、ProductionWebServerという名前のシステムに関する情報を集めるとする。
その場合は、findとgrepを組み合わせる。

$ find /data -type f -exec grep '{}' -e 'ProductionWebServer' \; -exec cat '{}' >> ProductionWebServerAgg.txt \;

joinコマンドにより、2つのファイルにあるデータの集約を行える。
次の2つのtxtファイルを結合する。
ips.txt

ip,OS
10.0.4.2,Windows 8
10.0.4.35,Ubuntu 16
10.0.4.107,macOS
10.0.4.145,macOS

user.txt

user,ip
jdoe,10.0.4.2
jsmith,10.0.4.35
msmith,10.0.4.107
tjones,10.0.4.145

両方のファイルをIPアドレスで集約する

$ join -t, -2 2 ips.txt user.txt
ip,OS,user
10.0.4.2,Windows 8,jdoe
10.0.4.35,Ubuntu 16,jsmith
10.0.4.107,macOS,msmith
10.0.4.145,macOS,tjones