目次

コマンドのメモ書き

rpm

# rpm -ivh ~.rpm

CentOSのバージョン確認

# cat /etc/redhat-release
CentOS release 5.5 (Final)

Grep

大文字を小文字を区別しません。

出力行頭に入力ファイルでの行番号を表示します。

検索に引っかからなかった行を出力します。

ディレクトリ配下のファイルとサブディレクトリも対象にします。

# grep -i exist /var/log/httpd/error_log
# grep -r exist /var/log/httpd/
# 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

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押下)<EOT>
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: <BROADCAST,MULTICAST,UP,LOWER_UP> 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」は背景色を指定。

01234567
BlackRedGreenYellowBlueMagentaCyanWhite

属性

属性番号attributes属性
1bold太字
2low intensity弱強調
4underline下線
5blink点滅
7reverse video反転
8invisible 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