====== コマンドのメモ書き ======
===== 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