GNU grep 2.25 で、pat1またはpat2の検索 $ grep '¥(pat1¥|pat2¥)' file .frcmodで終わる検索 $ grep '¥.frcmod$' file GNU emacs24.5.1 で、pat1またはpat2の検索 M-x query-replace-regexp や M-x occur で、条件は ¥(pat1¥|pat2¥)
grep | egrep | emacs | python | |
[...], ^, $ | v | v | v | v |
\<...\>, \b, \B | v | v | v | v |
グループ化 | \(...\) | (...) | \(...\) | \(...\) |
(...)* | v | v | v | v |
+ or \+ | \+ | + | + | + |
? or \? | \? | ? | ? | ? |
{...} or \{...\} 反復回数 | \{...\} | {...} | ・ | ・ |
\ or \| | \| | | | \| | \| |
$ grep 'grid.\+coord' *.[chly]
ソフトウェアを利用するための環境や、同じソフトウェアでもバージョンを切り替えて利用できる環境を 用意したり、削除したりするツールである。それぞれのソフトウェア・バージョンはモジュールと呼ばれる。 モジュール名(モジュールファイル)で指定された、変数や環境変数がセットされて環境が用意される。 module load モジュール名 #モジュールのロード(読み込み) module unload モジュール名 #モジュールをアンロード module list #ロードしているモジュールの一覧を表示 module avail #利用可能なモジュールを表示 シェルスクリプト内でこのツールを利用するときには、 source /etc/profile.d/modules.sh などを予め読み込んでおくらしい。[ref] https://qiita.com/Ag_smith/items/f268ad27165a60aecd35 その他詳細はこちら。
ファイル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で計算する。
du -a #カレントディレクトリ以下のファイルが表示される du -al #ハードリンクのファイルは通常ひとつしか表示されないが、それも表示する find -path '.*' #du -alと同様の表示
入力は行ごとにパターンスペースに入れられ(末尾の改行は削除される)、コマンド処理後に、 出力される(改行は追加される)。一時的な保存場所であるホールドスペース(初期値は空)を 利用できる。-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
man sed も見よ
\(, \), \{, \}, \? などは (, ), {, }, ? などと表記する。 その他に使える表現が増える。
リンク・マニュアル
例
$ tree --charset=C -I '*.pdb|*.gro|OUT.*|chignolin.*|genion.*|*~|*.cpt|*.edr|*.xtc|*.tpr|*.mdp|*.trr|*.top|*.o???[0-9]|min.log' ¥ | less > temp
X11, X, X Window System, 環境変数DISPLAY, ssh -Y などに関する背景はこちらを読め
コマンド
xen : keycodeなどがわかる xmodmap : 設定されている modifyer keyがわかる xmodmap -pke : キー設定のリスト表示
ローカルコンピュータとリモートコンピュータの間でのファイル転送をする。 (ローカルからリモートに転送したいファイルがある場合、 転送したいファイルがあるディレクトリをカレントディレクトリにしておくと、少し操作が楽。)
$ sftp userid@hostname sftpで使えるコマンド ls #リモート側のカレントディレクトリのls lls #ローカル側のカレントディレクトリのls cd #リモート側のディレクトリを移動 lcd #ローカル側のディレクトリを移動 put file #ローカルからリモート側へファイルを転送する get file #リモートからローカル側へファイルを転送する quit #sftpコマンドの終了 pwd #リモート側のpwd lpwd #ローカル側のpwd など
$ 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 -r hogehoge1 hogehoge2
$ find . -newer hogehoge -print
(HOGEDIRの部分は . など)
(参考) 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"}' #合計サイズだけ求める
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;
$HOGEDIRディレクトリの階層以下で、ファイルの末尾が .trjであるファイルのリストに対して、それぞれ個別に ls -1をする。 # {}はヒットしたパス名に置き換わる、\;は -execオプションの末尾として ;を与えるためにシェルのメタキャラをエスケープしている部分。 (参考) find $HOGEDIR -path '*\.trj' -exec ls -1 {} \;
# 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
find Adir -maxdepth 1 ! -regex '.*ABC.*' -type f -exec echo cp -ip {} Bdir/ \;
Adirディレクトリにある、ABC文字列を含むファイル名以外を、Bdirにコピーする。 なお、ディレクトリ名にABCが入っていてはダメ。。。?
削除は確認後にすべし。 find . -path '*/\._*' -delete find . -path '*/\.AppleDouble' -exec /bin/rm -rf {} \; find . -path '*/\.DS_Store' -delete
$ 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.
プログラムは -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
http://www.fos.kuis.kyoto-u.ac.jp/le2soft/siryo-html/node49.html
https://www.tohoho-web.com/ex/draft/gdb.htm
などを見よ
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 -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 とする。
A,B,C,D,E,Fは16進数の数字であり10,11,12,13,14,15を意味する (基数が何に設定されてても使えるようだ。入力、出力の基数はibase=16、obase=16などとすると変更可)。
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 uxa --forest ps ux --forest ps u $$ ps u -C cmd
オプション・引数
u ユーザ指向のフォーマットで表示 x 自分の全てのプロセス xa 全てのプロセス -C cmd コマンド名で指定 --forest ASCIIアートで階層表示 $$ シェル自身のPIDを指定してそれだけ表示
<defunct>マーク
プロセスはゾンビであることを示す。親プロセスによって正しく消去されていないために残っている。親プロセスが終了するとinitによって消去される。
プロセスの状態コード
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 -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)
rootで作業する(ファイルのパーミッションを保つため。一般ユーザの場合そのユーザー所有に変更される)
# find DIRECTORY | cpio -vo > FILE.cpio #コピーアウトモードと呼ばれる -v は表示
rootで作業する(アーカイブFILE.cpioにファイルが絶対パスで収められていたらそこに書き込まれるめ。 相対パスならカレントディレクトリから相対的に書き込まれる。変更のコントロールは出来ない?)
# cpio -vidmu < FILE.cpio #コピーインモードと呼ばれる -v は表示 -d はディレクトリが無ければ作る -m は日付を保つ -u は上書きをする(付けない方が無難か)
$ cpio -tv < FILE.cpio