bashメモ
よくわからなくなる部分をメモっとく。
rsync
フォルダの同期に使う。たまにしか使わないし、履歴一発でキメてしまうためよく忘れる。
# 基本的な使い方(-aでアーカイブモード、-rpltgoDと同じ) # -r:再帰的に同期 # -p:パーミッション情報保持 # -l:シンボリックリンクを同期先で再作成 # -t:タイムスタンプを保持 # -g:グループ情報を保持 # -o:オーナ情報を保持 # -D:同期先でデバイスを再作成(rootのみ可能) $ rsync -a 同期元ディレクトリ 同期先ディレクトリ # 進捗を表示する $ rsync -a --progress 同期元 同期先 # 情報強化(vは最大3つまで付けられる) $ rsync -avvv --progress 同期元 同期先
cut
cutはテキスト・ファイルの各行から指定した部分を取り出すコマンド。指定する部分には、バイト(-bオプション)、文字(-cオプション)、フィールド(-fオプション)が使える。
- 例:1文字目から10文字目といった範囲指定は「-c 1-10」
- 例:4文字目以降すべてを取り出す場合には「-c 4-」
tr
文字の置換(TRanslate)。改行削除とかに使ったりする。 例:abcを削除 $ cat sample.txt | tr -d abc
find
"find 「検索ディレクトリ」「検索条件」「コマンド」"が基本。 カレントディレクトリの中から*.cを探す例は以下。$ find . -name "*.c"
ここを参考にしよう。ちゃんとまとまってるし。
ヒストリ活用
bashのコマンド履歴を最大限使うためのコマンドたち。#最後のコマンドをもう1度 $ !! #n個前のコマンド実行 $ !-n #直近で使用した(command)から始まる履歴を再実行 $ !(command) #直近で使用した(command)から始まる履歴の2番目の引数を抜き出す $ !(command):2 #直近で使用した(string)を含む履歴の再実行。末尾の?は必ずしも必要ではない。 $ !?(string)? #直近で使用したコマンドの(string1)を(string2)に置換して実行 $ ^(string1)^(string2) #直近で使用したコマンドに含まれるパス名の、一番最後をちぎる $ !!:h #直近で使用したコマンドに含まれる拡張子をちぎる $ !!:r #直近で使用したコマンドに含まれるパス名の一番最後だけを残す $ !!:t #直近で使用したコマンドを表示 $ !!:p #直近で使用したコマンドをシングルクオートで囲む $ !!:q #直近で使用したコマンドの文字を置換 $ !!:s/(string1)/(string2)/
以下使用例。
# !!:h:直近で使用したコマンドに含まれるパス名の、一番最後をちぎる $ ls -lshrt /home/bisco/workspace $ !!:h # ls -lshrt /home/bisco $ !!:h # ls -lshrt /home # !!:r:直近で使用したコマンドに含まれる拡張子をちぎる $ ls -lshrt hello.txt $ !!:r # ls -lshrt hello
変数のマッチング(2つつくと最長、1つだと最短マッチ)
#は先頭から調べて、%は最後尾から調べる。${path##/*/} long.file.name ${path#/*/} can/book/long.file.name $path /home/can/book/long.file.name ${path%.} /home/can/book/long.file ${path%%.*} /home/can/book/long $var biscobiscobiscobisco ${var//bisco/hello} hellohellohellohello ${var/bisco/hello} hellobiscobiscobisco ${var/#bisco/hello} hellobiscobiscobisco ${var/%bisco/hello} biscobiscobiscohello
[脇道]改行コードの変換
わりと頻繁に忘れるからちゃんとメモ。改行コードはWin(Dos)とLinuxそれぞれ以下がデフォルト。- Dos:\r\n
- Linux:\n
# Dos→Lin $ cat text.txt | tr -d \\r > result.txt $ cat text.txt | sed -e 's/\r$//g' > result.txt $ cat text.txt | perl -pe 's/\r//g' > result.txt # Lin→Dos $ cat text.txt | awk '{sub(/$/,"\r"); print}' > result.txt $ cat text.txt | sed -e 's/$/\r/g' > result.txt $ cat text.txt | perl -pe 's/\n/\r\n/g' > result.txt
[脇道]文字コードの変換 without nkf
nkfなくてもrubyがあれば生きていける。 ここから引用しました。
# text.txtをutf-8に変換 $ cat text.txt | ruby -r nkf -pe '$_ = NKF.nkf "-w",$_'