vimで複数ファイルを操作する
似たような(?)スクリプトをvimで編集するケースを考えたい.
今回,自分が考えている状況は,グラフを作るgnuplotのスクリプトが10種類くらいあって,各々output名とか軸ラベルは異なるけど,余白とかフォントとかは統一したい.余白を変えるのに10種類開いて変えたり,sed書いたりはめんどくさい.
前置きとして,まず複数ファイルをvimで開く
vim *.sh
または
vim a.sh b.sh c.sh
そうすると複数ファイルが開かれるので
:files
で一覧を見ることができる.おそらくa.cが最初に参照されているので
:n 次のファイルに進む
:N 前のファイルに戻る
3ctrl-^ 3番目のファイルに移動する
で移動とかができる.
---[備考]---
最初に開くときに
vim -o a.sh b.sh
とやるとウインドウ分割で開く.縦に割りたいときは-Oで.
-----------------
開くのは良いとして,本題として全ファイルのhogeをfugaに置換する話.
まずはどのファイルを対象にするのか
:args *.sh
どのファイルが対象になったか確認するには
:args
今回であればa.sh b.sh c.shが出るはず.
これに対して一括置換をやりたければ
:argdo %s/hoge/fuga/g | update
こんな感じ.別に置換じゃなくても実行出来ます.
参考URLは以下のとおり.
nfsのキャッシュをローカルHDDに取る
うちはnfsを使ってhomeフォルダを各ユーザごとにマウントすることで,マシンが変わっても環境が変わらないようにしているんだけど,いろんな人が同時に触るとちょっと回線に負荷がかかって困る.
そこで,各マシンのローカルHDDにキャッシュを取ることにした.
使ったのはcachefilesdなるもの.取り敢えずfedora16に入れた.
CentOSとfedora16,18でyumで入れられることは確認済
1.ソフトのインストール
yum install -y cachefilesd
2.configの編集 (dirは/home/hpcl以下"以外"で.2-4はお好みで.)
vim /etc/cachefilesd.conf
1) dir キャッシュの作成先(dfコマンドでディスク使用量を確認するとよい)
2) brun 空き容量がこれ以上なら通常動作
3) bcull 空き容量がこれ以下ならキャッシュを間引く
4) bstop 空き容量がこれ以下ならキャッシュをやめる
3.サーバ接続設定にオプションを追加
vim /etc/fstab
例:192.168.1.1:/home nfs auto,fsc,soft 0 0
4.ソフトの起動
chkconfig cachefilesd on
service cachefilesd start
5.再起動
6.確認
1)キャッシュの作成先を辿って行くと@04みたいなファイルがある
2) cat /proc/fs/nfsfs/volumesのFSCがyesになっている
(1),(2)がOKなら問題なし!
ログアウト後もジョブを継続する
sshでジョブを実行中にうっかり抜けたり,ネットワークが不調になっても大丈夫なように,ログアウト後もジョブを継続するようにした.
nohupコマンドで何とか出来るらしい.
nohup sh ./abc.sh &
こうやるとログアウト後でも平気.
だけど標準出力が変な所($HOME/nohup.out)に吐かれるという仕様なので,
nohup sh ./abc.sh > a.log &
とかやっておけばOK.
いつか使ってみたい.タイル型ウインドウマネージャ
なかなか忙しくてネタが集まらない日々.
取り敢えず今日はメモだけ.
タイル型ウインドウマネージャっていうのはウインドウマネージャって名前がついてるけど,実際はほぼGUIすべてを取り仕切っている.っていうかGUI.
僕が入れたことあるのはXmonadだが,Fedoraのログイン画面にXmonadって出てきてgnome3じゃない画面が出てきて混乱する自体が発生して涙目.
Xmonad自体はyumでインストールできる.
Linuxはデスクトップにしか無いし,ノートPCはWindows+cygwinなので,なんか面白いの無いかなーとか思って探してたらWIndows用のタイル型ウインドウマネージャを発見.
https://github.com/Tzbob/python-windows-tiler
使い方は以下を参考.
http://d.hatena.ne.jp/uhiaha888/20121125/1353824257
Xmonadは混乱したけど,こっちを今度入れて少し慣れてみようかとか思っている所存
Linux テキストファイル 列結合
後輩に今日聞かれたので書いておく.
自分の環境でありがちな実験データとかで
hoge1.txt >>
name1 size1 time1
name2 size2 time2
hoge2.txt >>
name1 size1 time3
name2 size2 time4
みたいになってる結果のファイルがたくさんあったり,1000行あったりする.
join使えばいいじゃん!って思うかもしれないけど,実際のところ列は10個位あるからtimeしか欲しくないとか,execelに持って行く時面倒だ!とか文句があるので,
awk '{print $2}' hoge1.txt > tmp1
awk '{print $2}' hoge2.txt > tmp2
paste tmp1 tmp2 > result
こうすれば
result.txt >>
time1 time3
time2 time4
とかになる.
シェルスクリプトでプログラムの計測とかをするために
研究室を見てると,みんなシェルスクリプトを書いてるみたいだけど,シェルスクリプトのfor文には2種類ある事を知らない人が多いみたい.
僕はあんまり機会がなくて(2)は使わないんだけど,有効なので紹介する.
(1)よくあるfor文
for ( (n=0 ; n<100 ; n++ ) )
do
echo cat $n.txt
done
(2)カウンタに文字式を使う
for文の中は上と同じものだったとして,
do
echo $n
done
for文の条件式をこのように書くと
$ for n in 1 2 3
>> 1 2 3 (本当は開業されるけど省略)
$ for n in $(ls | grep *.txt)
>> hoge.txt fuga.txt hige.txt
$for n in $(cat hoge.txt)
>> セパレータで区切られたhoge.txt内の文字列を出力
$for n in $(awk '{print$1}' hoge,txt)
>> セパレータで区切られたhoge.txt内の第一フィールドの文字列を出力
こんな感じ.知らない人は使って.