Perl ワンライナー メモ
複数行にまたがる文字列置き換え
例:
以下から <select name="timezone"> <option value="a">... <option value="b">... <option value="c">... </select> ここまでをfooに置き換える。 以下は置き換えない。 <select name="other"> <option value="a">... <option value="b">... <option value="c">... </select>
以下のスクリプトでok
perl -p -0777 -i.bak -e "s#<select name=\"timezone\"([^(</select)]|.)*?</select>#foo#s;s/\.htm/.php/g;"
test.txt --- <div> abc </div> def <div> ghi </div> def <div> jkl </div> --- perl -p -0777 -i.bak -e "s#<div>.*?</div>#foo#gs;" test.txt
-0数字(8 進数) レコードセパレータ ($/) を 8 進数で示す。 デフォルトセパレーターは改行 -00 パラグラフモード。 パラグラフとは連続した改行で区切られる文の固まり -0777 セパレーターを無効にする。 すなわちファイル全体が1パラグラフになる -最小マッチ *? や、+? のように、量指定子のあとに?を置くことで最小マッチになる -s 正規表現の「s」は、「.」を改行にもマッチさせるオプション。 -m 正規表現の「m」は、文字列中の改行を無視させるオプション。
DBの操作
perl -MDBI -e '$dbh = DBI->connect("dbi:mysql:<DB名>:<IPアドレス>", "ユーザ名", "パスワード",{RaiseError => 1, PrintError => 1} ); $dbh->do(qq{ SELECT NOW() }, undef, q{DONE}) || die $dbh->errstr;' perl -MDBI -e '$dbh = DBI->connect("dbi:mysql:<DB名>:<IPアドレス>", "ユーザ名", "パスワード",{RaiseError => 1, PrintError => 1} ); $sth = $dbh->prepare(qq{ SELECT user_mail FROM user_table }) || die $dbh->errstr; $sth->execute(); while( @a = $sth->fetchrow_array() ){ print $a[0], "\n"; }'
- sedのように使う
# echo 'abc abc abc' | perl -pe 's|abc|ABC|g;' ABC ABC ABC
- pgrep by dan kogai
perl -le 'for (qx(ps awwux)){@F = split; print $F[1] if /$ARGV[0]/ and $F[1] != $$}'
# perl -MMIME::Base64 -e 'print encode_base64("yoshifumi1975");' # perl -MMIME::Base64 -e 'print decode_base64("eW9zaGlmdW1pMTk3NQ==");'
- AWK のように
a で、AWKのように入力の各フィールドをsplit して、@Fに自動で入れてくれる。
# chkconfig --list | perl -anle 'print $F[0];' atd crond httpd iptables lm_sensors network postfix snmpd snmptrapd sshd syslog sysstat