Netassist Blog

trコマンドな話。

こんにちは。技術部のobataです。

涼しい服装で出かけられる最適な気温の秋は一瞬で終わり、冬の足音がズシズシ聞こえる気温になりました。

今年はあまりにも秋が少なかった気がします。

あぁ残念。
秋よ、また来年。

みなさん風邪を引いておりませんでしょうか

 

 

さて、今回はtrコマンドについてお話して言いたいと思います。

このコマンドは置換コマンドなのですが、ずらーっと縦にでた結果をパパっと横一列にし、

次のコマンドに送ってさっと使う時、私はtrに任せています。

たとえば、あるファイルに入っているユーザを引っ張り出して、それを一列にして別のファイルへの検索条件にしたり、

サーバ移行の際、前のサーバ調査で入っているphpのモジュールをすべて出してから、
移行先サーバでそれを一斉にインストール!といった場面で便利かと思います。

ちょっと伝わりにくいかと思いますので、解説させていただきます。

tr

上記のサーバ移行の際のphpモジュールを例にご説明したいと思います。
移行前サーバと仮定し、現在入っているphpモジュールを出します。


[root@blog ~]# php -m
[PHP Modules]
bz2
calendar
Core
ctype
curl
date
ereg
exif
fileinfo
filter
ftp
gettext
gmp
hash
iconv
json
libxml
mhash
openssl
pcntl
pcre
Phar
readline
Reflection
session
shmop
SimpleXML
sockets
SPL
standard
tokenizer
xml
zip
zlib

[Zend Modules]

この結果を別のサーバでインストールする、という場合、この結果を横一列にしたいですよね。

加えて、モジュールの間にはスペースが欲しい。そうすれば、yum install の後に繋げればすぐにインストールできます。

yum install php-bz2 php-calendar ,,, このような感じに楽にできますね

それにはこの結果の改行を、スペースに置き換えなければなりません。

  

さっそく tr  ‘置換前’  ’置換後’ で置換してみたいと思います!


[root@blog ~]# php -m|tr '\n' ' '

 なんだコレ?と思う方もいるはず!念のため解説です。

この意味は

・php -mの結果をパイプで次へ渡します。
・trコマンドで、’\n(改行)’ を ‘(スペース)’ へ置換する
です。 シングルクォーテーションでスペースを指定していたのでなんだか見慣れない感じになっていたんですね。


それでは、意味もしっかり分かったところで叩いてみましょう!


[root@blog ~]# php -m|tr '\n' ' '
[PHP Modules] bz2 calendar Core ctype curl date ereg exif fileinfo filter ftp gettext gmp hash iconv json libxml mhash openssl pcntl pcre Phar readline Reflection session shmop SimpleXML sockets SPL standard tokenizer xml zip zlib [Zend Modules]

 

 

結果が一列、かつ間にスペースがちゃんと出た状態になりましたね!
 

 

 

置換前を見るとき、
「改行が各モジュール名の後ろについている」という所にピンと来ることができれば、
改行をスペースに置換するだけで各コマンドの後ろに来てくれる
という事に気付けるはずです。ココが案外難しい所かと思います。

 

普段から何かと使えるコマンドなので、手打ちなどせずにこちらを使ってみてください。

 

しかしこの結果をすぐに使えるようにするためには、
頭の[PHP Modules]と末尾の[Zend Modules]を消さなければ使えませんよね、

 

こんな時置換コマンドの仲間、sedを合わせてみます。

 

消したい二つの文字列の他と違う共通点は、[]でくくられているという事。

加えて、[]の中の文字は違う、という事をコマンドに表して指定していきたいと思います。

 

sedコマンドで削除する場合は  ‘/対象/d’で対象を削除という書式を使いますが、

[]は、それ自体意味を持つ正規表現のため、ただの記号として認識させたいので、バックスラッシュで意味をエスケープします。

[]さん達は今日は非番です、という事です。

また、[]の中の文字は違うので、ワイルドカードで”何でもいいし何文字でもいいなにか”という定義をします。

するとこうなります。

sed '/\[*\]/d'

非番の方と一緒に誰かいるご一行はお断りです、って意味ですね。

それでは叩いてみましょう。


[root@blog ~]# php -m|sed '/\[*\]/d'|tr '\n' ' '
bz2 calendar Core ctype curl date ereg exif fileinfo filter ftp gettext gmp hash iconv json libxml mhash openssl pcntl pcre Phar readline Reflection session shmop SimpleXML sockets SPL standard tokenizer xml zip zlib

きれいになりましたね!

しかし、この結果にyum install を付けるだけで使うためには、まだまだ足りません!各モジュール名の頭に”php-“をつけるため、xargsに仲介してもらいechoで表示してもらいます!

 

 

php -m |sed '/\[*\]/d' |xargs -I@ echo "php-@"|tr '\n' ' '

 

 

今回の主役trがかすんでしまいましたね、、、特に、xargsの登場で。

xargsは受け取った結果を次のコマンドへ送る、というコマンドです。

xargs前の結果に対し、全部頭に”php-“をつけるためにechoコマンドを使用し、trコマンドのセクションに送っています。

※ちなみにtrコマンドの前に持ってきた理由は、横一列にしてしまうと、それを一つのセクションとして見られてしまうからなのです。

まとめると、

①php のモジュール名を出し、

②前後の余計な部分をカットし、

③各モジュール名の頭に”php-“を付けて、

④改行をスペースに置換、しています。

 

では、最後の結果をたたいてみましょう!

 

 

[root@blog ~]# php -m |sed '/\[*\]/d' |xargs -I@ echo "php-@"|tr '\n' ' '
php-bz2 php-calendar php-Core php-ctype php-curl php-date php-ereg php-exif php-fileinfo php-filter php-ftp php-gettext php-gmp php-hash php-iconv php-json php-libxml php-mhash php-openssl php-pcntl php-pcre php-Phar php-readline php-Reflection php-session php-shmop php-SimpleXML php-sockets php-SPL php-standard php-tokenizer php-xml php-zip php-zlib 

  

完成です!
これなら移行先サーバにコピペしてパッと使えます!

だいぶtrコマンドの話から脱線しましたので、友情出演のsedとxargsはまたの機会にちゃんとご紹介しようかなと思っております。

 

みなさんもぜひ、コマンドを駆使して快適な抽出ライフをお送りください。

ここまで読んでいただき、ありがとうございます。

 

 

それではまた。