====== コマンドのメモ書き  ======
===== rpm  =====
# rpm -ivh ~.rpm
  * -i : インストール。
  * -U : アップグレード。インストール済みパッケージはアップグレードする。未インストールは、新たにそのパッケージをインストールする。
  * -F : アップグレード。インストール済みパッケージはアップグレードする。未インストールは何もしない。
  * -v : 操作対象のパッケージ名を表示する。
  * -h : 処理の進行状況を「#」記号で表示する。
===== CentOSのバージョン確認  =====
# cat /etc/redhat-release
CentOS release 5.5 (Final)
===== Grep  =====
  * -i
大文字を小文字を区別しません。
  * -n
出力行頭に入力ファイルでの行番号を表示します。
  * -v
検索に引っかからなかった行を出力します。
  * -R -r
ディレクトリ配下のファイルとサブディレクトリも対象にします。
# grep -i exist /var/log/httpd/error_log
# grep -r exist /var/log/httpd/
  * .svnファイルを除外
# grep -r exist /var/log/httpd/ | grep -v ".svn"
===== sed  =====
ファイル内の文字列置換
  * ファイル上書き
$ sed -i s/[置換対象]/[置換後文字列]/g [ファイル名]
  * 別ファイルに出力
$ sed -e s/[置換対象]/[置換後文字列]/g [入力ファイル名] > [出力ファイル名]
===== wget  =====
ファイルをダウンロードする
# wget http://download.url/download.file
デフォルトでは、コマンドを実行した場所にダウンロードしたファイルが保存される。
保存先ファイル名を指定して実行
wget -O "/etc/yum.repos.d/glusterfs-epel.repo" "http://download.gluster.org/pub/gluster/glusterfs/3.4/LATEST/CentOS/glusterfs-epel.repo"
保存先を指定して実行(ファイル名はオリジナル)
wget "http://download.gluster.org/pub/gluster/glusterfs/3.4/LATEST/CentOS/glusterfs-epel.repo" -P "/etc/yum.repos.d/"
===== 圧縮ファイルを解凍せずに開く  =====
# gzip -dc "圧縮ファイル.qz" | less
# bzip2 -dc "圧縮ファイル.qz" | less
===== dig  =====
IPアドレス<->名前解決を確認する(ドメイン名を問い合わせる)
  * インストールする
# yum -y install bind-utils
  * 問い合わせる
# dig @127.0.0.1 server.example.com
===== ランダムパスワード生成  =====
# yum install expect
# mkpasswd
6ln8,seXW
# mkpasswd -s 1 -C 2 -d 2 -l 8
q^jPT56v
  * s:記号
  * C:大文字
  * d:数字
  * l:文字数
===== ntp 手動時刻合わせ  =====
# /usr/sbin/ntpdate -b ntp.nict.jp
===== 指定時間にコマンド実行  =====
# yum install at
# /etc/init.d/atd start
# at 17:00
at> echo "hello world"
at> (ctrl+d押下)
job 7 at 2013-06-19 17:00
# atq
7       2013-06-19 17:00 a root
# at -c 7
~省略~
echo "hello world"
# atq
7        2013-06-19 17:00 a usu
8        2013-06-19 19:00 a usu
# atrm 8
# atq
7        2013-06-19 17:00 a usu
===== 削除できないファイルを削除  =====
何かの拍子(操作ミス)でできたゴミファイル「#{node.nginx.app_name}」
通常の操作では削除できないので、inodeを指定して削除する
# ll
合計 20
lrwxrwxrwx 1 root root   43  8月  7 19:07 2013 #{node.nginx.app_name} -> /mnt/addVol/releases/#{node.nginx.app_name}
drwxr-xr-x 2 root root 4096  5月 14 07:12 2013 cgi-bin
drwxr-xr-x 3 root root 4096  8月  7 12:57 2013 error
drwxr-xr-x 2 root root 4096  5月 14 07:12 2013 html
drwxr-xr-x 3 root root 4096  8月  7 12:57 2013 icons
inodeを調べる
# ls -i
264338 #{node.nginx.app_name}  263824 cgi-bin  263825 error  263850 html  263851 icons
inodeを指定して削除する
# find . -inum 264338 -exec rm -f {} \;
# ll
合計 20
drwxr-xr-x 2 root root 4096  5月 14 07:12 2013 cgi-bin
drwxr-xr-x 3 root root 4096  8月  7 12:57 2013 error
drwxr-xr-x 2 root root 4096  5月 14 07:12 2013 html
drwxr-xr-x 3 root root 4096  8月  7 12:57 2013 icons
===== 改行コードを確認する  =====
# cat -v テキストファイル名
行末に「^M」が表示されていれば、改行コード「CRLF(windows形式)」
===== ログ圧縮等でワイルドカードはループで処理  =====
#!/bin/sh
# パラメータ
TMP="/mnt/addVol/tmp/"
COMPRESS_DAY=`date -d '15 days ago' '+%Y%m%d'`
DELETE_DAY=`date -d '91 days ago' '+%Y%m%d'`
#echo $TMP
echo "==============="
echo "COMP:"$COMPRESS_DAY
echo "DEL:"$DELETE_DAY
echo "==============="
###############################################################################
# 圧縮
for txt in $TMP"*_"$COMPRESS_DAY".txt" ; do
  bzip2 ${txt}
done
# 削除
for txt in $TMP"*_"$DELETE_DAY".txt.bz2" ; do
  rm -f  ${txt}
done
===== ワンライナーでループ  =====
元ネタ
for txt in /var/log/httpd/*2013* ; do
  bzip2 ${txt}
done
ワンライナーで書き換え(行末の区切りを;でつなげる)
for txt in /var/log/httpd/*2013* ; do bzip2 ${txt} ; done ;
===== ワンライナーでIPアドレス取得  =====
通常
# ip addr show eth1
3: eth1:  mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 1000
    link/ether 00:50:56:b6:2e:5c brd ff:ff:ff:ff:ff:ff
    inet 192.168.10.2/24 brd 192.168.10.255 scope global eth1
    inet 192.168.10.4/32 scope global eth1
ワンライナー
# x="" ; for IP in `ip addr show eth1 | grep "^  *inet" | sed 's/^  *inet //g' | sed 's/\/.*//g'` ; do x="$x"" ""$IP" ; done ; echo $x ;
192.168.10.2 192.168.10.4
===== プロセス数取得  =====
e.g. apache httpdの場合
/bin/ps -ef|grep -v grep|grep httpd |wc -l
===== 不正終了などでlockファイルが残った時の対処  =====
# /etc/init.d/mysqld status
mysqld dead but subsys locked
mysqld は停止していますがサブシテムがロックされています
# ll /var/lock/subsys/
~
-rw-r--r-- 1 root root 0 Sep  6 02:24 mysqld
~
# rm -rf /var/lock/subsys/mysqld
===== 指定階層以下のディレクトリに実行権限をつける  =====
# find /path/dir -type d -print | xargs chmod +x
===== apache(シェルのないユーザ)でログイン  =====
# su - apache --shell=/bin/bash
===== apacheでsudo  =====
==== ユーザー「apache」でsudoしようとすると、以下のエラーが発生。  ====
sudo: sorry, you must have a tty to run sudo
設定ファイルを書き換えることでsudo可能
# visudo
-) Defaults    requiretty
+) #Defaults    requiretty
==== sudoでパスワードを不要にする  ====
sudo: no tty present and no askpass program specified
# sudo visudo
実行したいコマンドをカンマ区切りで記述
+)apache  ALL=(ALL) NOPASSWD: /bin/ls, /bin/chmod
または、アリアリ
+) apache  ALL=(ALL)       NOPASSWD:ALL
===== プロセスの現在のメモリ使用量を確認  =====
psコマンドにcオプションをつけて、VSZでソート。
VSZ、RSSからメモリ使用量を確認。
# ps auxc --sort -vsz
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
mysql    17860  3.5  6.8 3063908 267420 ?      Sl   11:35   1:51 mysqld
nobody   24738  1.9  0.2 203136 11240 ?        Ssl   2013 898:00 gmond
root      1024  0.0  0.1 197168  4772 ?        S     2013   8:41 snmpd
root      2019  0.0  0.0 117208  1268 ?        Ss    2013   0:36 crond
===== swapの掃除  =====
# swapoff -a && swapon -a
===== 正規表現:ある文字列を含まない  =====
^(?!.*ある文字列).+$
===== inodeサイズを確認する =====
通常、ext2/ext3では128byteで、ext4は256byteで管理されます。
# debugfs -R stats /dev/mapper/VGroup00-main_lv00 | grep size
debugfs 1.41.12 (17-May-2010)
Filesystem features:      has_journal ext_attr resize_inode dir_index filetype needs_recovery extent flex_bg sparse_super large_file huge_file uninit_bg dir_nlink extra_isize
Block size:               4096
Fragment size:            4096
Flex block group size:    16
Inode size:               256
Required extra isize:     28
Desired extra isize:      28
作成時に-Iオプションを指定して任意のサイズに変更することが可能です。
mkfs -t ext4 -I 512 /dev/VGroup00/main_lv00
===== pgrep、pkillでプロセスを殺す =====
# pgrep -f http
27057
27059
27061
# pgrep -fl http
27057 /usr/sbin/httpd
27059 /usr/bin/logger -t httpd -p local6.info
27061 /usr/sbin/httpd
# pkill -f プロセス名
===== cpコマンドで確認なしに上書き =====
ファイル単位
# cp -f source target
ディレクトリ単位
# cp -rf source target
ところが、OSによってはディレクトリ単位でコピーしようとすると、1ファイルずつ確認してくる。
これは、エイリアスで「-i(プロンプトを表示する)」オプションが有効になっているため。
# alias
alias cp='cp -i'
コマンドの頭に 「\」を付けて一時的にエイリアスを無効化して実行する。
# \cp -rf source target
===== findで検索したファイルを削除する =====
# find ./ -name '*.log' | xargs rm
===== 検索結果のファイルの文字列一括置換 =====
grep -rl '置換前文字列' 対象パス | xargs sed -i 's/置換前文字列/置換後文字列/g'
===== ファイルのタイムスタンプを変更する =====
^ オプション ^ 説明 ^
| -a | 最終アクセス時刻 |
| -m | 最終更新日時 |
| -t | 日時 [[CC]YY]MMDDhhmm[.ss] |
| CC | 年(上2桁、省略可能) |
| YY | 年(下2桁、省略可能) |
| MM | 月(01-12) |
| DD | 日(01-31) |
| hh | 時(00-23) |
| mm | 分(00-59) |
| .ss | 秒(00-59、省略可能) |
touchコマンドで現時刻のファイルを作成する。
(ls -lは最終更新日時、ls -luは最終アクセス日時を表示)
# touch file.txt
# ls -l file.txt
-rw-r--r-- 1 root root 0  4月 18 13:20 file.txt
# ls -lu file.txt
-rw-r--r-- 1 root root 0  4月 18 13:20 file.txt
最終アクセス日時2014年4月1日1時1分に変更
# touch -at 201404010101 file.txt
# ls -l file.txt
-rw-r--r-- 1 root root 0  4月 18 13:20 file.txt
# ls -lu file.txt
-rw-r--r-- 1 root root 0  4月  1 01:01 file.txt
最終更新日時2014年4月1日4時1分に変更
# touch -mt 201404010401 file.txt
# ls -l file.txt
-rw-r--r-- 1 root root 0  4月  1 04:01 file.txt
# ls -lu file.txt
-rw-r--r-- 1 root root 0  4月  1 01:01 file.txt
===== 日時のファイル名を付ける =====
# touch $(date +%Y%m%d_%H%M%S).txt
# ll
合計 1
-rw-r--r--  1 root root     0  6月 27 21:58 2014 20140627_215822.txt
===== vimエディタで制御文字を入力 =====
Ctrl+V 制御文字
e.g. エスケープ文字を入力
Ctrl+V Ctrl+[
===== シェルスクリプトでECHOに装飾 =====
echo -e "\e[33m=== TEST ===\e[m"
制御文字のESC(16進数で1b)を挿入できる場合には、「\e」「\033」は不要。
vimで入力する場合、「Ctrl+V ⇒ Ctrl+[ ⇒ [33m」となる。
echo "ESC[33m=== TEST ===ESC[m"
カラーコード
2桁の数字の1文字目「3」は文字色を、「4」は背景色を指定。
^0^1^2^3^4^5^6^7^
|Black|Red|Green|Yellow|Blue|Magenta|Cyan|White|
属性
^属性番号^attributes^属性^
|1|bold|太字|
|2|low intensity|弱強調|
|4|underline|下線|
|5|blink|点滅|
|7|reverse video|反転|
|8|invisible text|非表示|
e.g. 黄色背景に黒文字強調
echo -e "\e[43;30;1m=== flash ===\e[m"
===== awkで動的な変数を正規表現にセットする =====
変数を正規表現の検索文字列にしたい場合は、シングルクォート、ダブルクォートで囲む。
awk '$1 ~ /'"$検索文字列変数"'/' ファイル名
$VAL="taro"
awk '$1 ~ /'"$VAL"'/' log.txt
===== awkでソートせずに重複行を削除する =====
awk '!a[$0]++' FILE    // 行全体で重複を確認、結果は行全体を返す
awk '!a[$1]++' FILE    // 1項目目で重複を確認して、結果は行全体を返す
awk '!a[$6]++{print $6}' FILE    // 6項目目で重複を確認して、結果は6項目目を返す
以下の方法もあるが、sortでかなりのコストが必要なので、上の方が効率が良い。
awk '{print $6}' FILE | sort | uniq                  
===== ファイルを空にする =====
ログファイルなど、ファイルの中身を空にしたいときのコマンド
# > file
または
# : > file
===== findである時期以前を一括圧縮 =====
あるディレクトリについて、その階層のみで、30日以前のファイルを個別にbzipに圧縮する。
# find ./ -maxdepth 1 -mtime +30 -exec bzip2 {} \;
===== cURL =====
==== ベーシック認証など ====
curl --anyauth --user user:password http://www.example.com/
==== httpsのエラー無視 ====
curl --anyauth --user user:password http://www.example.com/
==== ホストヘッダ偽装 ====
curl -H Host:www.example.co.jp http://www.example.com/
===== tar.bz2の圧縮・解凍 =====
==== 圧縮 ====
tar cf - /PATH/TO/BACKUP_DIR | bzip2 > /PATH/TO/BACKUP_DIR.tar.bz2
==== 解凍 ====
time tar jxvf /PATH/TO/BACKUP_DIR.tar.bz2