Linux」カテゴリーアーカイブ

プロセス置換を使って複数のパイプを受け取る,あるいは一時ファイルを節約する方法

スポンサード リンク

コマンドの実行結果を他のコマンドに渡したいとき,普通はパイプを使って渡す。

 ~ $ paste --help | nl
     1  Usage: paste [OPTION]... [FILE]...
     2  Write lines consisting of the sequentially corresponding lines from
     3  each FILE, separated by TABs, to standard output.
     4  With no FILE, or when FILE is -, read standard input.

     5  Mandatory arguments to long options are mandatory for short options too.
     6    -d, --delimiters=LIST   reuse characters from LIST instead of TABs
     7    -s, --serial            paste one file at a time instead of in parallel
     8        --help     display this help and exit
     9        --version  output version information and exit

    10  Report bugs to <bug-coreutils@gnu.org>.

渡したい実行結果が1つだけならこれで良いのだが,2つ以上渡したいときはどうしたらいいだろうか。
≫ 続きを読む



カテゴリー: コマンドメモ | コメントする

percolを書き換えていい感じにzshで履歴検索できるようにする

スポンサード リンク

percolはインタラクティブに標準入力を行単位でしぼりこむためのpythonスクリプトである。百聞は一見にしかずというし,画像を見て欲しい。

デフォルト設定のpercolでファイルを選択する

デフォルト設定のpercolでファイルを選択する

画像はデフォルトでの挙動だが,Hpercolのカスタマイズについて書く。ちなみにヴァージョンは percol 0.08 のお話。
≫ 続きを読む



カテゴリー: CentOS, Debian, Fedora, Python, コマンドメモ | コメントする

Vimの現在のバッファの中身を外部コマンドでフィルタする方法

スポンサード リンク

Vimで開いているバッファの中身を外部コマンドに渡して,フィルタしたいとする。もちろん,バッファはフィルタ後の内容で置換されて欲しい。

例えば,バッファの中身が

hoge huga

というときに sed -e ‘s/hoge/piyo/’ という外部コマンドを適用して,

piyo huga

に変えたいときは,

:%!sed -e 's/hoge/piyo/'

とexコマンドを打てばよい。

もちろん,今回の例では外部コマンドを呼び出さずとも

:%s/hoge/piyo/

で良いわけだが,任意の外部コマンドを使えるわけだから応用範囲はかなり広いと思う。



カテゴリー: Vim, コマンドメモ | コメントする

[GNU Screen] .screenrc に環境依存の設定を書く方法

zshなどのシェルでは設定ファイル内部で条件分岐を記述できるので,.zshrcに

if [ `hostname` = "hoge" ]; then 
  source $HOME/.zshrc_hoge
fi

と書けば,特定のホストhogeだけで.zshrc_hogeが読み込まれる。もうちょっとエレガント?にしたいなら次のようにも書ける。

[ -f $HOME/.zshrc_`hostname` ] &&  source $HOME/.zshrc_`hostname`

こうして様々な環境用の設定ファイルを統一しておくと,gitやらdropboxで設定ファイルを共有するときに非常に楽だ。マシンによってドットファイルの中身がばらばらで,どれが最新版なのかわからない,なんてことを防げるようになる。

非常に便利なので同じようなことをGNU Screenでもやりたいのだが,残念ながら.screenrcでは条件分岐が書けない。そこで,環境変数を使うことにした。
≫ 続きを読む

カテゴリー: コマンドメモ, シェルスクリプト | コメントする

aptとpipでインストールできるpythonパッケージの違いとは?

pythonの適当なライブラリをインストールしようとすると,

# apt-get install python-hoge
# pip install hoge

の2通りの方法があることは珍しくない。

では,この2つはどう違っていて,どちらを使うべきなのだろうか。
≫ 続きを読む

カテゴリー: Debian, Python | コメントする

GNU Screenでタブをまとめるタブ(入れ子型ウィンドウグループ)で大量のウィンドウを管理する

はじめに

GNU screenで,タブをまとめるタブ的なUIでウィンドウグループを実現する方法を紹介する。正確には,ウィンドウをまとめるウィンドウだが。

Screenの入れ子によるウィンドウグループの実現

Screenの入れ子によるウィンドウグループの実現

(能書きはいいから,という人はとにかくお前の.screenrcを見せろをご覧ください)

みなさんは,GNU Screenで大量のウィンドウを開くときどうやって管理しているだろうか。正面から攻めるならウィンドウグループ(window group)を使うのが普通であり,すでにかなり詳しい説明がある(下URL参照)。

開発版GNU Screenで楽々ウィンドウ管理 – Keep It Simple, Stupid
これからの「GNU Screen」の話をしよう – Keep It Simple, Stupid

記事を初めて読んだときは,すごい!と思って僕もウィンドウグループを使って大量のウィンドウを捌こうとしてみた。が,ウィンドウの役割ごとに番号を決めて……という運用では定形作業なら良いけれども,適当な作業ばかりしている僕にはウィンドウと番号の関係を把握しきれないことが判明した。だからこそ,グループ化して管理したかったわけでありまして……。

まぁ,windowlistを見ろって話なんだが,そのためだけに領域を1つ消費するのは断じて許せない。しかも,「次のウィンドウに移る」,「前のウィンドウに移る」のと同じ感覚で「次のウィンドウグループに移る」,「前のウィンドウグループに移る」ショートカットキーが無いのは個人的には致命的と思う。

そこで,卜部昌平のあまりreblogしないtumblr – 俺の .screenrc が火を吹くぜにあるようなSTEM-LEAFの入れ子によって「入れ子型ウィンドウグループ」を実現することにした。

動作確認しているバージョンは Screen version 4.01.00devel (GNU) 2-May-06 および Screen version 4.02.01 (GNU) 28-Apr-14 である。
≫ 続きを読む

カテゴリー: CentOS, CUIでいこう, Cygwin, Debian, Fedora | コメントする

物理サーバーから仮想サーバーへの移行計画

このWordpressを含め,我が家では1台のサーバーで

  • Webサーバー
  • DNSサーバー
  • ファイルサーバー
  • 録画サーバー
  • SSHサーバー(踏み台)
  • メールサーバー

と沢山の役割を担わせてきた。しかし,2010年に組み立てたシステム(CentOS 5.11 & HP MicroServer)ではいいかげん更新しなくてはならない。もちろん,旧サーバーは稼働させたままで新しいサーバーに移転したいところである。が,更新のためだけに新しくサーバーを買いたくはない。狭い自宅をこれ以上狭くできないのだ。

ということで,MicroServer上のCentOSに仮想マシンを立てて,ゆるゆると移行していくことにした。仮想サーバーならば,MicroServerが物理的にぶっ壊れても緊急避難的にWindowsのデスクトップPCで動作させられるし,テストとか,将来的な更新も楽そうだ。

仮想化の技術は VirtualBox,VMware,KVM,Zen,etc. と色々あって迷ってしまうのだが,Linuxでしか動かないKVMやプロプラのVMwareは避けてVirtualBoxを採用したいと思う。

カテゴリー: CentOS, Debian, Fedora, MicroServer | コメントする

URLに応じてLAN内部のWebサーバーを振り分ける

例えば,

http://test.com  -> 192.168.xx.yy
http://test.com/hoge -> 192.168.xx.zz

みたいに,アドレスによってLAN内部のWebサーバーに振り分けたかった。

我が家のルータの設定で外部にhttpのポートを公開しているのは 192.168.xx.yy だけであり,このマシンのapacheで Virtualhost と ProxyPass を設定することによって振り分けを実現する。
≫ 続きを読む

カテゴリー: CentOS, Linux | コメントする

GNU ScreenでSSH接続したいならキーバインドを作るより,シェルのエイリアスを使おう

GNU Screen上で楽にSSH接続を実現する方法として,多段キーバインドを設定する方法が広く使われている。例えば,以下のサイトのように。

開発版GNU Screenで楽々ウィンドウ管理 – Keep It Simple, Stupid

私は複数あるサーバに ssh し易いよう、以下のような感じでランチャ風に多段キーバインドを定義しています。

# alias for remote login
# override default `^V'(digraph) mapping
bind ^V eval 'command -c rlogin' 'echo "select server category: [0]  [1]Web [2] [3] [4] [5]DB [6] [7]Test [8] [9]"'
bind -c rlogin 1 eval 'command -c rlogin1' 'echo "login to: (1 Web)  [1]websvr1 [2]websvr2"'
bind -c rlogin 5 eval 'command -c rlogin5' 'echo "login to: (5 DB)   [1]dbsvr1  [2]dbsvr2"'
bind -c rlogin 7 eval 'command -c rlogin7' 'echo "login to: (7 Test) [1]testweb [5]testdb [6]testdb2"'

# (1 Web/)
bind -c rlogin1 1 eval 'screen -t websvr1 11 ssh websvr1' '@group Web/'
bind -c rlogin1 2 eval 'screen -t websvr2 13 ssh websvr2' '@group Web/'
bind -c rlogin1 3 eval 'screen -t websvr3 16 ssh websvr3' '@group Web/'

# (5 DB/)
bind -c rlogin5 1 eval 'screen -t dbsvr1 51 ssh dbsvr1' '@group DB/'
bind -c rlogin5 2 eval 'screen -t dbsvr2 55 ssh dbsvr2' '@group DB/'

# (7 Test/)
## (7 Test/TestWeb/)
bind -c rlogin7 1 eval 'screen -t testweb 701 ssh testweb' '@group TestWeb/'

## (7 Test/TestDB/)
bind -c rlogin7 5 eval 'screen -t testdb 750 ssh testdb' '@group TestDB/'
bind -c rlogin7 6 eval 'screen -t testdb2 755 ssh oracle@testdb2' 'encoding eucjp' '@group TestDB/'

こうするとssh接続のためのローカルのシェルは不要で,とってもスマートな感じになる。だがしかし,Screenの多段キーバインドを使ってしまうと,例えば上記のWebsvr1に接続するキーは ^a^V11 となり,決して打ちやすくない。いちいちCtrlキーなんて押したくないよ…… そのうえScreenのbindは一文字しか設定できないからとっても困る。

ということで,僕はシェルのエイリアスを使うことにした。 ≫ 続きを読む

カテゴリー: CUIでいこう, コマンドメモ, シェルスクリプト | コメントする

xargsでワイルドカードを使いたいときはシェルを実行しよう

例えば,

$ ls
1.txt 1.dat 1.dat2
2.txt 2.dat 2.dat2
3.txt 3.dat 3.dat2
4.txt 4.dat 4.dat2
5.txt 5.dat 5.dat2
file.txt

$ cat file.txt
1
2
5

というときに,xargs を使ってfile.txtに書いてある数字で,拡張子が.dat*のファイル(つまり,1.dat, 2.dat, 5.dat, 1.dat2, 2.dat2, 5.dat2)に ls -l を適用したいとする。素直に書くと

$ cat file.txt | xargs -I{} ls -l {}.dat*
zsh: no matches found: {}.dat*

とエラーになる。
≫ 続きを読む

カテゴリー: CentOS, Debian, Fedora, コマンドメモ, シェルスクリプト | コメントする