Memo/Perl/OneLiner

https://dexlab.net:443/pukiwiki/index.php?Memo/Perl/OneLiner
 

ワンライナー


SQLの分析

  • SQLから指定のkey=valueを抽出。シングルクオートを$sqとして指定するのがポイント
    echo "SELECT name, password FROM user WHERE id='abc12823' and password='k#eyAW37';" | perl -ne 'BEGIN {$sq="\x27";} print "$1\n" if /(id\s*=\s*$sq[^$sq]*$sq)/g'
    id='abc12823'

起動オプション

perlrun - Perl インタプリタの起動方法 - perldoc.jp


URI文字列の分解


日付と時刻

  • HTTPヘッダの「Last-Modified:」をGMTからJSTに変換して表示。「-u」でUTC表示
    curl -s -I https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js | perl -ane "if(/Last-Modified: /){print $';}" | xargs -i date '+%Y-%m-%d %H:%M:%S %Z' -d {}
    2016-07-12 16:12:44 JST

複数行マッチと置換

  • "-0"と"s///m" を使う。任意文字マッチ"."は動作しなかった。
    echo -e "123\n456\n789" | perl -0pe 's/3\n45//mg'
    126
    789

アクセスログの集計

  • 1時間毎のログの件数
    perl -ne 'if(m#01/Aug/2013:(\d+)#){$c{$1}++}END{for(keys %c){print "$_ $c{$_}\n"} }' /var/log/httpd/access_log | sort -n
    
    # 結果 時 件数
    01 113
    02 243
  • 1分毎のログの件数
    perl -ne 'if(m#01/Aug/2013:(\d+:\d+)#){$c{$1}++}END{for(keys %c){print "$_ $c{$_}\n"} }' /var/log/httpd/access_log | sort -n
    
    # 結果 時:分 件数
    01:58 5
    01:59 3
    02:00 5

BEGIN と ENDブロック

  • BEGIN {...} 一番初めに実行される
  • END{...} 最後に実行される
  • 例:2行目までの合計
    vim /tmp/test.log
    ----
    1
    2
    3
    4
    5
    ----
    
    cat /tmp/test.log | perl -ne 'BEGIN{$sum=0;} if($. <= 2){$sum+=$_;} END{print $sum;}'
    3

swapサイズ

  • swapサイズ(MB)
    perl -e '$m=readpipe("free -m");$m=~/Swap:\s+(\d+)/i;print int($1)'

メモリ容量/空き容量

  • メモリ容量(MB)
    perl -e '$m=readpipe("free -m");$m=~/Mem:\s+(\d+)/i;print int($1)'
  • メモリ空き容量(MB)
    perl -e '$m=readpipe("free -m");$m=~/cache:\s+(\d+)\s+(\d+)/i;print int($2)'

数値の比較

  • 例:ログファイルの「 0.0000 」という部分のみを取り出し、2以上の行数をカウント
    cat example.log | perl -ane 'if(/ (\d+\.\d+) /) { if($1 >= 2) { print "$1\n";} }' | wc -l

置換

  • 改行コード。CRLF(windows)からLF(unix)へ変換
    perl -p -i -e "s/\r\n/\n/g" *.sh
  • 先頭のタブの削除。バックアップは作らない。バックアップを作る場合は「-i.bak」
    perl -p -i -e "s/^\t+//g" *.txt

バージョン文字列の抽出

  • bash
    bash --version | perl -ane 'if($.==1 && /version (\d+)\./){ print $1;}'
    # 3
  • CentOS
    perl -ane '/CentOS release ([5-6])|Red Hat Enterprise Linux .* ([5-6])/; print $1' /etc/redhat-release
    # 6
  • Apache
    httpd -v | perl -ane 'if( $F[2]=~/Apache\/(\d+\.\d+)/ ){ print $1; }'
    # 2.2

ディスクサイズ/空きディスクサイズ

  • "-P"オプションで常に1行で表示
    • /mntのディスクサイズをMBで取得
      df -P -m /mnt 2>&1 | perl -ane 'if($.==2) {print $F[1];}'
    • /mntの使用量をMBで取得
      df -P -m /mnt 2>&1 | perl -ane 'if($.==2) {print $F[2];}'
    • /mntの空きをMBで取得
      df -P -m /mnt 2>&1 | perl -ane 'if($.==2) {print $F[3];}'

CSV

  • 0列目=a, 1列目=bと一致する行の0列目を改行無しで取得
    perl -F, -ane 'if($F[0] eq "a" && $F[1] eq "b") { $F[0]=~s/\x0D?\x0A?$//;print $F[0]; }' sample.csv

行単位、パラグラフ単位、ファイル単位の指定

#ファイルを行単位でソートします 
perl  -e 'print sort <>' file 

#ファイルをパラグラフ単位でソートします 
perl  -00 -e 'print sort <>' file 

#複数ファイルをファイル毎比較してソートしてから1本のファイルとして表示し 
ます 
perl  -0777 -e 'print sort <>' file1 file2

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2018-09-15 (土) 07:31:38 (11d)