howto/linuxコマンド †一行メモ †
ファイルhoge1.outとhoge2.outの中に以下のような数値が出力されている。出力されている順番に、差を求めたい。 hoge1.out ... Frequencies -- -500.7208 -500.7202 58.3287 ... Frequencies -- 70.2251 104.3229 172.1244 ... Frequencies -- 172.1303 241.4551 248.0223 ... hoge2.out ... Frequencies -- -500.4196 -500.4196 58.2761 ... Frequencies -- 70.1453 104.2697 173.3204 ... Frequencies -- 173.3204 241.3123 248.0306 ... $ paste <(grep "Frequencies" hoge1.out | awk '{print $3,$4,$5}' | tr ' ' '\n') \ <(grep "Frequencies" hoge2.out | awk '{print $3,$4,$5}' | tr ' ' '\n') \ | sed 's/\t/\t-\t/' > temp $ paste temp <(bc < temp) とすると、 -500.7208 - -500.4196 -.3012 -500.7202 - -500.4196 -.3006 58.3287 - 58.2761 .0526 70.2251 - 70.1453 .0798 104.3229 - 104.2697 .0532 172.1244 - 173.3204 -1.1960 172.1303 - 173.3204 -1.1901 241.4551 - 241.3123 .1428 248.0223 - 248.0306 -.0083 ... と計算できる。各行は、hoge1.outの値、マイナス、hoge2.outの値、その計算結果である。
hoge1.outがあったとする。 ... Frequencies -- -500.7208 -500.7202 58.3287 ... Frequencies -- 70.2251 104.3229 172.1244 ... Frequencies -- 172.1303 241.4551 248.0223 ... 次のように " Frequencies --"から始まる行にマッチしたら、$3~$NFまでのフィールドを ひとつずつprintするとよい(NFはその行のフィールド数) $ awk '/^ Frequencies --/ {for(i=3;i<=NF;i++) print $i}' hoge1.out -500.7208 -500.7202 58.3287 ...
$ grep GB$ hoge.out | sed 's/^.*://' | sed 's/GB//' | sed -z 's/\n\(.\)/\+\1/g' | bc hoge.outとして次のような出力が含まれるとき、上のワンライナーで GBの数字の和を求められる。 ... item1: 1.1GB ... item2: 0.1GB ... itemN: 1.1GB ... [補足] 最後の sedの -zオプションは行分割を NULLにし、\nを検索対象にするために必要である。 gも必要である(行分割をNULLにしたので1行はデータの末尾までになるため)。
cat hoge.out | sed -n '/GB$/{s/^.*: *//; s/ *GB//; H;}; ${g; s/\n//; s/\n/+/g; p}' | bc GB$の行を見つけたら行頭の "itemn: "のところを削除し、" *GB"を削除し、sedのホールドスペースに追加する。 最後の行の処理を終えたら ホールドスペースの内容をパターンスペースにコピーし、先頭の改行を削除してから、 改行を+に置き換えて、出力し、bcで計算する。
sed †入力は行ごとにパターンスペースに入れられ(末尾の改行は削除される)、コマンド処理後に、 出力される(改行は追加される)。一時的な保存場所であるホールドスペース(初期値は空)を 利用できる。-nオプション付きの場合、下記のpコマンドで出力しない限り何も出力されない。 コマンド s/検索文字列/置換後文字列/オプション 文字列の置換(パターンスーペース内) オプション g 置換を最後まで行う(g無いときは1回だけ行う) 検索文字列 . 任意の文字 * 直前の文字の0個以上の繰り返し(.*で任意の文字列) ^ 行頭 $ 行末 \(...\) 括弧でくくった部分は、置換後文字列として\1,\2,...で使用できる \| または d 削除(パターンスーペース内) p 出力する(パターンスペース内)、sed -n で実行した時にこの出力だけ得られる G ホールドスペースの内容をパターンスペースに追加(追加の前に改行が追加される) h パターンスペースの内容をホールドスペースにコピー g ホールドスペースの内容をパターンスペースにコピー H パターンスペースの内容をホールドスペースに追加(追加の前に改行が追加される) N 次の入力行をパターンスペースに追加 b [label] labelに分岐する。labelが無ければ末尾に分岐。 = 行番号を出力する(改行つき) 上記コマンドの前には対象を指定できる /検索文字列/[!] 検索文字列を含む行を対象、!がある場合は否定の意味 行番号[,行番号][!] 入力の行番号(から行番号)の行を対象、!がある場合は否定の意味、 $は最終行の行番号 ;で区切ってコマンドを複数書ける。 {}でコマンドをくくって複数書ける。 例) sed '1,/^$/d' hogefile #1行目から、2行目以降の空行までを削除し、それ以降を出力する sed -n '/GB/p' hogefile #これは grep GB hogefile と同じ結果 sed -n '1,2p; /GB/{s/pot/Pot/; s/:/=\t/; p}' sed -n '1,2{=; p}; /GB/{s/0/a/; N; N; =; p}' E表現の数値を小数点以下4桁に切り捨てる例) sed 's/\(-\?[0-9]\.\|-\?\.\)\([0-9]\{4\}\)\([0-9]*\)\([eEdD][+-]\?[0-9]\{2\}\)/\1\2\4/g' filename sed -r 's/(-?[0-9]\.|-?\.)([0-9]{4})([0-9]*)([eEdD][+-]?[0-9]{2})/\1\2\4/g' filename filename内の継続行(バックスラッシュ'\'とこれに続く改行'\n')を削除し1行にする例) sed ':a;N;$!ba;s/\\\n//g' filename (説明) :a で aというラベルを定義しておく。 N で次の行をパターンスペースに追加し、 $! で最後の行以外の行に対して、次のコマンド(ba)を実行する。ba は aラベルにジャンプする。 最後の行のときにパターンスペース(全ての行が含まれる)に対して、置換 s/\\\n//gを行なう。結果も出力される。 [ref] https://qiita.com/gin_135/items/773fec1343a69c9f90d6 拡張正規表現 ( sed -r ) †\(, \), \{, \}, \? などは (, ), {, }, ? などと表記する。 その他に使える表現が増える。 tree †リンク・マニュアル
例 $ tree --charset=C -I '*.pdb|*.gro|OUT.*|chignolin.*|genion.*|*~|*.cpt|*.edr|*.xtc|*.tpr|*.mdp|*.trr|*.top|*.o???[0-9]|min.log' ¥ | less > temp X Window System (Linuxでウィンドウが出る仕組み) †X11, X, X Window System, 環境変数DISPLAY, ssh -Y などに関する背景はこちらを読め
xmodmapの説明 †
コマンド xen : keycodeなどがわかる xmodmap : 設定されている modifyer keyがわかる xmodmap -pke : キー設定のリスト表示 sftp †ローカルコンピュータとリモートコンピュータの間でのファイル転送をする。 (ローカルからリモートに転送したいファイルがある場合、 転送したいファイルがあるディレクトリをカレントディレクトリにしておくと、少し操作が楽。) $ sftp userid@hostname sftpで使えるコマンド ls #リモート側のカレントディレクトリのls lls #ローカル側のカレントディレクトリのls cd #リモート側のディレクトリを移動 lcd #ローカル側のディレクトリを移動 put file #ローカルからリモート側へファイルを転送する get file #リモートからローカル側へファイルを転送する quit #sftpコマンドの終了 pwd #リモート側のpwd lpwd #ローカル側のpwd など ssh関係 †X11転送を利用するオプション(ssh接続先で、ウィンドウを出すプログラムを動かして、ローカル側にウィンドウを出す) †$ ssh userid@hostname -Y -YC を指定した場合、通信データが圧縮される。例えば、自宅から大学のコンピュータにssh接続してウィンドウを出す場合には、 そこそこ速くなる。大学内のコンピュータ間ではほとんど速さは変わらない。 -Y オプション使用しなかった場合、環境変数DISPLAYを使用することで、ローカル側にウィンドウを出すこともできる。 接続先のホストキーが変った時 †$ ssh hostname として @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY! になったとき、いったん $ ssh-keygen -R hostname としてから、もしくはsshがサジェストしたコマンドを実行してから、ssh接続する。 IPアドレスについても同様に削除するとよい。 diff †ふたつのディレクトリ以下の階層を比較する †$ diff -r hogehoge1 hogehoge2 find †ファイルhogehogeよりも新しいファイルをカレントディレクトリ以下の階層から探して表示する †$ find . -newer hogehoge -print ファイルのリストと、サイズを調べる †(HOGEDIRの部分は . など) $HOGEDIRディレクトリの階層以下で、ファイルの末尾が .trjのファイルのリスト †(参考) find $HOGEDIR -path '*\.trj' (参考) find $HOGEDIR -path '*\.trj' -printf "%p\t%s\n" | awk '{print $1 "\t" $2/1000/1000/1000 " GB"}' #ファイルサイズも表示 find $HOGEDIR -path '*\.trj' -printf "%p\t%s\n" | awk '{sum+=$2; print $1 "\t" $2/1000/1000/1000 " GB"} END{print sum/1000/1000/1000 " GB"}' #合計サイズも求める (参考) find $HOGEDIR -path '*\.trj' -printf "%p\t%s\n" | awk '{sum+=$2} END{print sum/1000/1000/1000 " GB"}' #合計サイズだけ求める $HOGEDIRディレクトリの階層以下で、ファイルの末尾が .trjのファイルを全て削除する †find $HOGEDIR -path '*\.trj' -delete 例えば、いくつかの拡張子のファイルを一気に削除する場合 find $HOGEDIR -path '*\.trj' -delete; find $HOGEDIR -path '*\.rst' -delete; find $HOGEDIR -path '*\.nuc' -delete; find $HOGEDIR -path '*\.vtk' -delete; find $HOGEDIR -path '*\.vti' -delete; execオプションの例 †$HOGEDIRディレクトリの階層以下で、ファイルの末尾が .trjであるファイルのリストに対して、それぞれ個別に ls -1をする。 # {}はヒットしたパス名に置き換わる、\;は -execオプションの末尾として ;を与えるためにシェルのメタキャラをエスケープしている部分。 (参考) find $HOGEDIR -path '*\.trj' -exec ls -1 {} \; カレントディレクトリ以下の階層で、ファイル名にcmakeがつくものをすべて削除する? †# Find and then delete all files under current directory (.) that: # 1. contains cmake (case-&insensitive) in it's path (wholename) # 2. name is not CMakeLists.txt find . -iwholename '*cmake*' -not -name CMakeLists.txt -delete 複雑な例1 †find Adir -maxdepth 1 ! -regex '.*ABC.*' -type f -exec echo cp -ip {} Bdir/ \; Adirディレクトリにある、ABC文字列を含むファイル名以外を、Bdirにコピーする。 なお、ディレクトリ名にABCが入っていてはダメ。。。? AppleDoubleなどを削除する †削除は確認後にすべし。 find . -path '*/\._*' -delete find . -path '*/\.AppleDouble' -exec /bin/rm -rf {} \; find . -path '*/\.DS_Store' -delete dig †ホスト名を逆引きして調べる †
$ dig -x 133.60.113.208 +short #ホスト名だけ出力 orange.eit.hirosaki-u.ac.jp. $ dig +noall +answer -x 133.60.113.208 #タイトル無しで、answer sectionだけ出力 208.113.60.133.in-addr.arpa. 3600 IN PTR orange.eit.hirosaki-u.ac.jp. gdb †使い方 †プログラムは -g つきでコンパイルしておく。 gdb a.out > run #走らせる gdb a.out > break file.c:216 #ブレークポイントを設置 > run -text input.rst input.rst-text #走らせる(a.outに与える引数付き) https://www.ois-yokohama.co.jp/oisblog2018/archives/3195 awk †統計屋のためのAWK入門 †http://antibayesian.hateblo.jp/entry/2014/09/15/162605 1ライナーで統計処理あり。なお、Linux上ではbashのメタキャラが展開されるので " は ' としなければならない。 awkインタプリタなので、実行はすごく遅い。 (例) 度数分布。binは幅 awk 'BEGIN{ bin=1.0 } { f[ int($1/bin) ]++ } END{ for( i in f ) print i*bin, f[i] }' < data.txt bc †lとsオプションはつけた方がよい †bc -ls とする
数学関数の利用方法 †bc -l とすること(オプション -l)で、標準的な数学関数が使えるようになる s (x) The sine of x, x is in radians. c (x) The cosine of x, x is in radians. a (x) The arctangent of x, arctangent returns radians. l (x) The natural logarithm of x. e (x) The exponential function of raising e to the value x. j (n,x) The bessel function of integer order n of x. 独自の関数を定義 †例1) log_2 (x) define lg(x) { return (l(x) / l(2)); } 例2) 二点間の距離 define dist (x,y,z,u,v,w) { return sqrt((x-u)*(x-u)+(y-v)*(y-v)+(z-w)*(z-w)); } 例3) 羃乗 define pow (x,y) { auto k, ans; ans=1; for ( k=0; k<y; k++ ) { ans = ans*x; } return ans; } その他は man bc を参照のこと 平方根は sqrt( ) 1.23e-4 とかの表現できない。 1.23*10^-4 とする。 top †リンク †topコマンドで覚えておきたい使い方14個 [#x0821353] バッチモードを使った例 †while true; do for i in 1 2 3 4; do ssh compute-0-$i "hostname; top -b -n 1 | sed '2,6d' | head -7" done echo ------------------------------------------------------------------------------- sleep 5 done ps †よく使うパターン †ps uxa --forest ps ux --forest ps u $$ ps u -C cmd オプション・引数 u ユーザ指向のフォーマットで表示 x 自分の全てのプロセス xa 全てのプロセス -C cmd コマンド名で指定 --forest ASCIIアートで階層表示 $$ シェル自身のPIDを指定してそれだけ表示 出力の見方 †<defunct>マーク プロセスの状態コード D 割り込み不可能なスリープ状態(通常I/O中) R 実行中又は実行可能状態 S 割り込み可能なスリープ状態 T ジョブ制御シグナルまたはトレースされているために停止中の状態 Z ゾンビプロセス Fカラム(プロセスフラグ) 次の値の合計 1 fork された(execは含まず) 4 スーパーユーザー権限を使っている VSZとRSS VSZ: プロセスの仮想メモリサイズ(未割当の領域を含むサイズ) RSS: プロセスの常駐メモリサイズ(他のプロセスと共有している領域も含む) サイズはいずれも KiB (2014-byte units) [補足] 未割当の領域=プロセスが確保したがまだ使用されていなく、物理的に割り当てられていない領域。 その後、使用されると物理的に確保される(このときシステムに残りが無いと判ったらOOMでkillされる)。 その他 †man ps を参照のこと rsync †基本的な使い方 †$ rsync -av -e ssh --delete EPG username@machine:/disk1 EPGディレクトリを、/disk1ディレクトリ内にrsyncする。 (危険注意) EPG ではなく、EPG/ とすると、disk1の中にEPGディレクトリが出来るのではなく、 元のdisk1が丸ごと削除(disk1に他のファイル・ディレクトリがあるとそれは削除)されて、 disk1の内容がEPGになるので非常に危ない。 各オプションの意味 -a equivalent to -rlptgoD -v increase verbosity -e specify the remote shell to use --delete delete files that don't exist on the sending side -r recurse into directories -l copy symlinks as symlinks -p preserve permissions -t preserve times -g preserve group -o preserve owner (root only) -D preserve devices (root only) cpio †アーカイブに保存するとき †rootで作業する(ファイルのパーミッションを保つため。一般ユーザの場合そのユーザー所有に変更される) # find DIRECTORY | cpio -vo > FILE.cpio #コピーアウトモードと呼ばれる -v は表示 アーカイブから展開するとき †rootで作業する(アーカイブFILE.cpioにファイルが絶対パスで収められていたらそこに書き込まれるめ。 相対パスならカレントディレクトリから相対的に書き込まれる。変更のコントロールは出来ない?) # cpio -vidmu < FILE.cpio #コピーインモードと呼ばれる -v は表示 -d はディレクトリが無ければ作る -m は日付を保つ -u は上書きをする(付けない方が無難か) アーカイブの中身を見るとき †$ cpio -tv < FILE.cpio |