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

[ref] https://qiita.com/gin_135/items/773fec1343a69c9f90d6
man sed も見よ

拡張正規表現 ( 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がつくものをすべて削除する?

http://stackoverflow.com/questions/9680420/looking-for-a-cmake-clean-command-to-clear-up-cmake-output から

# 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
http://www.fos.kuis.kyoto-u.ac.jp/le2soft/siryo-html/node49.html
https://www.tohoho-web.com/ex/draft/gdb.htm
などを見よ

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とかの表現は可能か?

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>マーク
プロセスはゾンビであることを示す。親プロセスによって正しく消去されていないために残っている。親プロセスが終了すると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

基本的な使い方

$ 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

トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS