データ処理-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文字以上の文字列にマッチし、>で終了する。
{ "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