Memo/Perl/OneLiner

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

ワンライナー


SQLの分析

  • SQLから指定のkey=valueを抽出。シングルクオートを$sqとして指定するのがポイント
    1. 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'
    2. id='abc12823'

起動オプション

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


URI文字列の分解


日付と時刻

  • HTTPヘッダの「Last-Modified:」をGMTからJSTに変換して表示。「-u」でUTC表示
    1. 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 {}
    2. 2016-07-12 16:12:44 JST

複数行マッチと置換

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

アクセスログの集計

  • 1時間毎のログの件数
    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
    2.  
    3. # 結果 時 件数
    4. 01 113
    5. 02 243
  • 1分毎のログの件数
    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
    2.  
    3. # 結果 時:分 件数
    4. 01:58 5
    5. 01:59 3
    6. 02:00 5

BEGIN と ENDブロック

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

swapサイズ

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

メモリ容量/空き容量

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

数値の比較

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

置換

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

バージョン文字列の抽出

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

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

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

CSV

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

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

  1. #ファイルを行単位でソートします
  2. perl  -e 'print sort <>' file
  3.  
  4. #ファイルをパラグラフ単位でソートします
  5. perl  -00 -e 'print sort <>' file
  6.  
  7. #複数ファイルをファイル毎比較してソートしてから1本のファイルとして表示し
  8. ます
  9. perl  -0777 -e 'print sort <>' file1 file2

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2017-05-25 (木) 12:54:59 (420d)