經常使用命令|經常使用操做

經常使用命令:
find查找{java

# linux文件無建立時間
# Access 使用時間
# Modify 內容修改時間
# Change 狀態改變時間(權限、屬主)
# 時間默認以24小時爲單位,當前時間到向前24小時爲0天,向前48-72小時爲2天
# -and 且 匹配兩個條件 參數能夠肯定時間範圍 -mtime +2 -and -mtime -4
# -or 或 匹配任意一個條件node

find /etc -name "*http*" # 按文件名查找
find . -type f # 查找某一類型文件
find / -perm # 按照文件權限查找
find / -user # 按照文件屬主查找
find / -group # 按照文件所屬的組來查找文件
find / -atime -n # 文件使用時間在N天之內
find / -atime +n # 文件使用時間在N天之前
find / -mtime +n # 文件內容改變時間在N天之前
find / -ctime +n # 文件狀態改變時間在N天前
find / -mmin +30 # 按分鐘查找內容改變
find / -size +1000000c -print # 查找文件長度大於1M字節的文件
find /etc -name "*passwd*" -exec grep "xuesong" {} \; # 按名字查找文件傳遞給-exec後命令
find . -name 't*' -exec basename {} \; # 查找文件名,不取路徑
find . -type f -name "err*" -exec rename err ERR {} \; # 批量更名(查找err 替換爲 ERR {}文件
find path -name *name1* -or -name *name2* # 查找任意一個關鍵字mysql

}linux

sort排序{ios

-t # 指定排序時所用的欄位分隔字符
-n # 依照數值的大小排序
-r # 以相反的順序來排序
-f # 排序時,將小寫字母視爲大寫字母
-d # 排序時,處理英文字母、數字及空格字符外,忽略其餘的字符
-c # 檢查文件是否已經按照順序排序
-b # 忽略每行前面開始處的空格字符
-M # 前面3個字母依照月份的縮寫進行排序
-k # 指定域
-m # 將幾個排序好的文件進行合併
-T # 指定臨時文件目錄,默認在/tmp
-o # 將排序後的結果存入指定的文nginx

sort -n # 按數字排序
sort -nr # 按數字倒敘
sort -u # 過濾重複行
sort -m a.txt c.txt # 將兩個文件內容整合到一塊兒
sort -n -t' ' -k 2 -k 3 a.txt # 第二域相同,將從第三域進行升降處理
sort -n -t':' -k 3r a.txt # 以:爲分割域的第三域進行倒敘排列
sort -k 1.3 a.txt # 從第三個字母起進行排序
sort -t" " -k 2n -u a.txt # 以第二域進行排序,若是遇到重複的,就刪除git

}程序員

vim編輯器{github

gconf-editor # 配置編輯器
/etc/vimrc # 配置文件路徑
vim +24 file # 打開文件定位到指定行
vim file1 file2 # 打開多個文件
vim -r file # 恢復上次異常關閉的文件 .file.swp 
vim -O2 file1 file2 # 垂直分屏
vim -on file1 file2 # 水平分屏
Ctrl+ U # 向前翻頁
Ctrl+ D # 向後翻頁
Ctrl+ww # 在窗口間切換
Ctrl+w +or-or= # 增減高度
:sp filename # 上下分割打開新文件
:vs filename # 左右分割打開新文件
:set nu # 打開行號
:set nonu # 取消行號
:nohl # 取消高亮
:set paste # 取消縮進
:set autoindent # 設置自動縮進
:set ff # 查看文本格式
:set binary # 改成unix格式
:%s/str/newstr/g # 所有替換
:200 # 跳轉到200 1 文件頭
G # 跳到行尾
dd # 刪除當前行 並複製 可直接p粘貼
11111dd # 刪除11111行,可用來清空文件
r # 替換單個字符
R # 替換多個字符
u # 撤銷上次操做
* # 全文匹配當前光標所在字符串
$ # 行尾
0 # 行首
X # 文檔加密
v = # 自動格式化代碼
Ctrl+v # 可視模式
Ctrl+v I ESC # 多行操做
Ctrl+v s ESC # 批量取消註釋web

}

歸檔解壓縮{

tar zxvpf gz.tar.gz dir # 解包指定tar.gz中的內容 不指定目錄則全解壓
tar zcvpf /$path/gz.tar.gz * # 打包gz 注意*最好用相對路徑
tar zcf /$path/gz.tar.gz * # 打包正確不提示
tar ztvpf gz.tar.gz # 查看gz
tar xvf 1.tar -C dir # 解包tar 放到指定目錄
tar -cvf 1.tar * # 打包tar
tar tvf 1.tar # 查看tar
tar -rvf 1.tar filename # 給tar追加文件
tar --exclude=/home/dmtsai --exclude=*.tar -zcvf myfile.tar.gz /home/* /etc # 打包/home, /etc ,但排除 /home/dmtsai
tar -N "2005/06/01" -zcvf home.tar.gz /home # 在 /home 當中,比 2005/06/01 新的文件才備份
tar -zcvfh home.tar.gz /home # 打包目錄中包括鏈接目錄
tar zcf - ./ | ssh root@IP "tar zxf - -C /xxxx" # 一邊壓縮一邊解壓
zgrep str 1.gz # 查看壓縮包中文件字符行
bzip2 -dv 1.tar.bz2 # 解壓bzip2
bzip2 -v 1.tar # bzip2壓縮
bzcat # 查看bzip2
gzip A # 直接壓縮文件 # 壓縮後源文件消失
gunzip A.gz # 直接解壓文件 # 解壓後源文件消失
gzip -dv 1.tar.gz # 解壓gzip到tar
gzip -v 1.tar # 壓縮tar到gz
unzip zip.zip # 解壓zip
zip zip.zip * # 壓縮zip
rar a rar.rar *.jpg # 壓縮文件爲rar包
unrar x rar.rar # 解壓rar包

}

svn更新代碼{

--force # 強制覆蓋
/usr/bin/svn --username user --password passwd co $Code ${SvnPath}src/ # 檢出整個項目
/usr/bin/svn --username user --password passwd up $Code ${SvnPath}src/ # 更新項目
/usr/bin/svn --username user --password passwd export $Code$File ${SvnPath}src/$File # 導出個別文件
/usr/bin/svn --username user --password passwd export -r 版本號 svn路徑 本地路徑 --force # 導出指定版本

}

git{

git clone git@10.10.10.10:gittest.git ./gittest/ # 克隆項目到指定目錄
git clone -b develop --depth=1 http://git.a.com/d.git # 克隆指定分支 克隆一層
git status # Show the working tree(工做樹) status
git log -n 1 --stat # 查看最後一第二天志文件
git branch -a # 列出遠程跟蹤分支(remote-tracking branches)和本地分支
git checkout developing # 切換到developing分支
git checkout -b release # 切換分支沒有從當前分支建立
git checkout -b release origin/master # 從遠程分支建立本地鏡像分支
git push origin --delete release # 從遠端刪除分區,服務端有可能設置保護不容許刪除
git push origin release # 把本地分支提交到遠程
git pull # 更新項目 須要cd到項目目錄中
git fetch -f -p # 抓取遠端代碼但不合併到當前
git reset --hard origin/master # 和遠端同步分支
git add . # 更新全部文件
git commit -m "gittest up" # 提交操做並添加備註
git push # 正式提交到遠程git服務器
git push [-u origin master] # 正式提交到遠程git服務器(master分支)
git tag [-a] dev-v-0.11.54 [-m 'fix #67'] # 建立tag,名爲dev-v-0.11.54,備註fix #67
git tag -l dev-v-0.11.54 # 查看tag(dev-v-0.11.5)
git push origin --tags # 提交tag
git reset --hard # 本地恢復整個項目
git rm -r -n --cached ./img # -n執行命令時,不會刪除任何文件,而是展現此命令要刪除的文件列表預覽
git rm -r --cached ./img # 執行刪除命令 須要commit和push讓遠程生效
git init --bare smc-content-check.git # 初始化新git項目 須要手動建立此目錄並給git用戶權限 chown -R git:git smc-content-check.git
git config --global credential.helper store # 記住密碼
git config [--global] user.name "your name" # 設置你的用戶名, 但願在一個特定的項目中使用不一樣的用戶或e-mail地址, 不要--global選項
git config [--global] user.email "your email" # 設置你的e-mail地址, 每次Git提交都會使用該信息
git config [--global] user.name # 查看用戶名
git config [--global] user.email # 查看用戶e-mail
git config --global --edit # 編輯~/.gitconfig(User-specific)配置文件, 值優先級高於/etc/gitconfig(System-wide)
git config --edit # 編輯.git/config(Repository specific)配置文件, 值優先級高於~/.gitconfig
git cherry-pick <commit id> # 用於把另外一個本地分支的commit修改應用到當前分支 須要push到遠程
git log --pretty=format:'%h: %s' 9378b62..HEAD # 查看指定範圍更新操做 commit id
git config --global core.ignorecase false # 設置全局大小寫敏感
git ls-remote --heads origin refs/heads/test # 查看

從遠端拉一份新的{
# You have not concluded your merge (MERGE_HEAD exists) git拉取失敗
git fetch --hard origin/master
git reset --hard origin/master
}

刪除遠程分支並新建{
git checkout master
git branch -r -d origin/test # 刪除遠程分支 但有時候並無刪除 能夠嘗試使用下面的語句
git push origin :test # 推送一個空分支到遠程分支,至關於刪除遠程分支
git branch -d test # 刪除本地test分支, -D 強制
git branch -a |grep test
git checkout -b test
git push origin test

git reset --hard origin/test 
}

遷移git項目{
git branch -r | grep -v '\->' | while read remote; do git branch --track "${remote#origin/}" "$remote"; done
git fetch --all
git pull --all
git remote set-url origin git@git.github.cn:server/gw.git
git push --all
}
}

恢復rm刪除的文件{

# debugfs針對 ext2 # ext3grep針對 ext3 # extundelete針對 ext4
df -T # 首先查看磁盤分區格式
umount /data/ # 卸載掛載,數據丟失請首先卸載掛載,或從新掛載只讀
ext3grep /dev/sdb1 --ls --inode 2 # 記錄信息繼續查找目錄下文件inode信息
ext3grep /dev/sdb1 --ls --inode 131081 # 此處是inode
ext3grep /dev/sdb1 --restore-inode 49153 # 記錄下inode信息開始恢復目錄

}

rpm{

rpm -ivh lynx # rpm安裝
rpm -e lynx # 卸載包
rpm -e lynx --nodeps # 強制卸載
rpm -qa # 查看全部安裝的rpm包
rpm -qa | grep lynx # 查找包是否安裝
rpm -ql # 軟件包路徑
rpm -Uvh # 升級包
rpm --test lynx # 測試
rpm -qc # 軟件包配置文檔
rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6 # 導入rpm的簽名信息
rpm --initdb # 初始化rpm 數據庫
rpm --rebuilddb # 重建rpm數據庫 在rpm和yum無響應的狀況使用 先 rm -f /var/lib/rpm/__db.00* 在重建

}

yum{

yum list # 全部軟件列表
yum install 包名 # 安裝包和依賴包
yum -y update # 升級全部包版本,依賴關係,系統版本內核都升級
yum -y update 軟件包名 # 升級指定的軟件包
yum -y upgrade # 不改變軟件設置更新軟件,系統版本升級,內核不改變
yum search mail # yum搜索相關包
yum grouplist # 軟件包組
yum -y groupinstall "Virtualization" # 安裝軟件包組
repoquery -ql gstreamer # 不安裝軟件查看包含文件
yum clean all # 清除var下緩存

}

yum使用epel源{

# 包下載地址: http://download.fedoraproject.org/pub/epel # 選擇版本5\6\7
rpm -Uvh http://mirrors.hustunique.com/epel//6/x86_64/epel-release-6-8.noarch.rpm

# 自適配版本
yum install epel-release

}

自定義yum源{

find /etc/yum.repos.d -name "*.repo" -exec mv {} {}.bak \;

vim /etc/yum.repos.d/yum.repo
[yum]
#http
baseurl=http://10.0.0.1/centos5.5
#掛載iso
#mount -o loop CentOS-5.8-x86_64-bin-DVD-1of2.iso /data/iso/
#本地
#baseurl=file:///data/iso/
enable=1

#導入key
rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5

}

源碼安裝{

./configure --help # 查看全部編譯參數
./configure --prefix=/usr/local/ # 配置參數
make # 編譯
# make -j 8 # 多線程編譯,速度較快,但有些軟件不支持
make install # 安裝包
make clean # 清除編譯結果

}

開機啓動腳本順序{

/etc/profile
/etc/profile.d/*.sh
~/bash_profile
~/.bashrc
/etc/bashrc

}

進程管理{

ps -eaf # 查看全部進程
kill -9 PID # 強制終止某個PID進程
kill -15 PID # 安全退出 需程序內部處理信號
cmd & # 命令後臺運行
nohup cmd & # 後臺運行不受shell退出影響
ctrl+z # 將前臺放入後臺(暫停)
jobs # 查看後臺運行程序
bg 2 # 啓動後臺暫停進程
fg 2 # 調回後臺進程
pstree # 進程樹
vmstat 1 9 # 每隔一秒報告系統性能信息9次
sar # 查看cpu等狀態
lsof file # 顯示打開指定文件的全部進程
lsof -i:32768 # 查看端口的進程
renice +1 180 # 把180號進程的優先級加1
exec sh a.sh # 子進程替換原來程序的pid, 避免supervisor沒法強制殺死進程

ps{

ps aux |grep -v USER | sort -nk +4 | tail # 顯示消耗內存最多的10個運行中的進程,之內存使用量排序.cpu +3
# USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
%CPU # 進程的cpu佔用率
%MEM # 進程的內存佔用率
VSZ # 進程虛擬大小,單位K(即總佔用內存大小,包括真實內存和虛擬內存)
RSS # 進程使用的駐留集大小即實際物理內存大小
START # 進程啓動時間和日期
佔用的虛擬內存大小 = VSZ - RSS

ps -eo pid,lstart,etime,args # 查看進程啓動時間

}

top{

前五行是系統總體的統計信息。
第一行: 任務隊列信息,同 uptime 命令的執行結果。內容以下:
01:06:48 當前時間
up 1:22 系統運行時間,格式爲時:分
1 user 當前登陸用戶數
load average: 0.06, 0.60, 0.48 系統負載,即任務隊列的平均長度。
三個數值分別爲 1分鐘、5分鐘、15分鐘前到如今的平均值。

第2、三行:爲進程和CPU的信息。當有多個CPU時,這些內容可能會超過兩行。內容以下:
Tasks: 29 total 進程總數
1 running 正在運行的進程數
28 sleeping 睡眠的進程數
0 stopped 中止的進程數
0 zombie 殭屍進程數
Cpu(s): 0.3% us 用戶空間佔用CPU百分比
1.0% sy 內核空間佔用CPU百分比
0.0% ni 用戶進程空間內改變過優先級的進程佔用CPU百分比
98.7% id 空閒CPU百分比
0.0% wa 等待輸入輸出的CPU時間百分比
0.0% hi
0.0% si

第4、五行:爲內存信息。內容以下:
Mem: 191272k total 物理內存總量
173656k used 使用的物理內存總量
17616k free 空閒內存總量
22052k buffers 用做內核緩存的內存量
Swap: 192772k total 交換區總量
0k used 使用的交換區總量
192772k free 空閒交換區總量
123988k cached 緩衝的交換區總量。
內存中的內容被換出到交換區,然後又被換入到內存,但使用過的交換區還沒有被覆蓋,
該數值即爲這些內容已存在於內存中的交換區的大小。
相應的內存再次被換出時可沒必要再對交換區寫入。

進程信息區,各列的含義以下: # 顯示各個進程的詳細信息

序號 列名 含義
a PID 進程id
b PPID 父進程id
c RUSER Real user name
d UID 進程全部者的用戶id
e USER 進程全部者的用戶名
f GROUP 進程全部者的組名
g TTY 啓動進程的終端名。不是從終端啓動的進程則顯示爲 ?
h PR 優先級
i NI nice值。負值表示高優先級,正值表示低優先級
j P 最後使用的CPU,僅在多CPU環境下有意義
k %CPU 上次更新到如今的CPU時間佔用百分比
l TIME 進程使用的CPU時間總計,單位秒
m TIME+ 進程使用的CPU時間總計,單位1/100秒
n %MEM 進程使用的物理內存百分比
o VIRT 進程使用的虛擬內存總量,單位kb。VIRT=SWAP+RES
p SWAP 進程使用的虛擬內存中,被換出的大小,單位kb。
q RES 進程使用的、未被換出的物理內存大小,單位kb。RES=CODE+DATA
r CODE 可執行代碼佔用的物理內存大小,單位kb
s DATA 可執行代碼之外的部分(數據段+棧)佔用的物理內存大小,單位kb
t SHR 共享內存大小,單位kb
u nFLT 頁面錯誤次數
v nDRT 最後一次寫入到如今,被修改過的頁面數。
w S 進程狀態。
D=不可中斷的睡眠狀態
R=運行
S=睡眠
T=跟蹤/中止
Z=殭屍進程 父進程在但並不等待子進程
x COMMAND 命令名/命令行
y WCHAN 若該進程在睡眠,則顯示睡眠中的系統函數名
z Flags 任務標誌,參考 sched.h

}

列出正在佔用swap的進程{

#!/bin/bash
echo -e "PID\t\tSwap\t\tProc_Name"
# 拿出/proc目錄下全部以數字爲名的目錄(進程名是數字纔是進程,其餘如sys,net等存放的是其餘信息)
for pid in `ls -l /proc | grep ^d | awk '{ print $9 }'| grep -v [^0-9]`
do
# 讓進程釋放swap的方法只有一個:就是重啓該進程。或者等其自動釋放。放
# 若是進程會自動釋放,那麼咱們就不會寫腳原本找他了,找他都是由於他沒有自動釋放。
# 因此咱們要列出佔用swap並須要重啓的進程,可是init這個進程是系統裏全部進程的祖先進程
# 重啓init進程意味着重啓系統,這是萬萬不能夠的,因此就沒必要檢測他了,以避免對系統形成影響。
if [ $pid -eq 1 ];then continue;fi
grep -q "Swap" /proc/$pid/smaps 2>/dev/null
if [ $? -eq 0 ];then
swap=$(grep Swap /proc/$pid/smaps \
| gawk '{ sum+=$2;} END{ print sum }')
proc_name=$(ps aux | grep -w "$pid" | grep -v grep \
| awk '{ for(i=11;i<=NF;i++){ printf("%s ",$i); }}')
if [ $swap -gt 0 ];then
echo -e "${pid}\t${swap}\t${proc_name}"
fi
fi
done | sort -k2 -n | awk -F'\t' '{
pid[NR]=$1;
size[NR]=$2;
name[NR]=$3;
}
END{
for(id=1;id<=length(pid);id++)
{
if(size[id]<1024)
printf("%-10s\t%15sKB\t%s\n",pid[id],size[id],name[id]);
else if(size[id]<1048576)
printf("%-10s\t%15.2fMB\t%s\n",pid[id],size[id]/1024,name[id]);
else
printf("%-10s\t%15.2fGB\t%s\n",pid[id],size[id]/1048576,name[id]);
}
}'

}

linux操做系統提供的信號{

kill -l # 查看linux提供的信號
trap "echo aaa" 2 3 15 # shell使用 trap 捕捉退出信號

# 發送信號通常有兩種緣由:
# 1(被動式) 內核檢測到一個系統事件.例如子進程退出會像父進程發送SIGCHLD信號.鍵盤按下control+c會發送SIGINT信號
# 2(主動式) 經過系統調用kill來向指定進程發送信號
# 進程結束信號 SIGTERM 和 SIGKILL 的區別: SIGTERM 比較友好,進程能捕捉這個信號,根據您的須要來關閉程序。在關閉程序以前,您能夠結束打開的記錄文件和完成正在作的任務。在某些狀況下,假如進程正在進行做業並且不能中斷,那麼進程能夠忽略這個SIGTERM信號。
# 若是一個進程收到一個SIGUSR1信號,而後執行信號綁定函數,第二個SIGUSR2信號又來了,第一個信號沒有被處理完畢的話,第二個信號就會丟棄。

SIGHUP 1 A # 終端掛起或者控制進程終止
SIGINT 2 A # 鍵盤終端進程(如control+c)
SIGQUIT 3 C # 鍵盤的退出鍵被按下
SIGILL 4 C # 非法指令
SIGABRT 6 C # 由abort(3)發出的退出指令
SIGFPE 8 C # 浮點異常
SIGKILL 9 AEF # Kill信號 馬上中止
SIGSEGV 11 C # 無效的內存引用
SIGPIPE 13 A # 管道破裂: 寫一個沒有讀端口的管道
SIGALRM 14 A # 鬧鐘信號 由alarm(2)發出的信號
SIGTERM 15 A # 終止信號,可以讓程序安全退出 kill -15
SIGUSR1 30,10,16 A # 用戶自定義信號1
SIGUSR2 31,12,17 A # 用戶自定義信號2
SIGCHLD 20,17,18 B # 子進程結束自動向父進程發送SIGCHLD信號
SIGCONT 19,18,25 # 進程繼續(曾被中止的進程)
SIGSTOP 17,19,23 DEF # 終止進程
SIGTSTP 18,20,24 D # 控制終端(tty)上按下中止鍵
SIGTTIN 21,21,26 D # 後臺進程企圖從控制終端讀
SIGTTOU 22,22,27 D # 後臺進程企圖從控制終端寫

缺省處理動做一項中的字母含義以下:
A 缺省的動做是終止進程
B 缺省的動做是忽略此信號,將該信號丟棄,不作處理
C 缺省的動做是終止進程並進行內核映像轉儲(dump core),內核映像轉儲是指將進程數據在內存的映像和進程在內核結構中的部份內容以必定格式轉儲到文件系統,而且進程退出執行,這樣作的好處是爲程序員提供了方便,使得他們能夠獲得進程當時執行時的數據值,容許他們肯定轉儲的緣由,而且能夠調試他們的程序。
D 缺省的動做是中止進程,進入中止情況之後還能從新進行下去,通常是在調試的過程當中(例如ptrace系統調用)
E 信號不能被捕獲
F 信號不能被忽略
}

系統性能狀態{

vmstat 1 9

r # 等待執行的任務數。當這個值超過了cpu線程數,就會出現cpu瓶頸。
b # 等待IO的進程數量,表示阻塞的進程。
swpd # 虛擬內存已使用的大小,如大於0,表示機器物理內存不足,如不是程序內存泄露,那麼該升級內存。
free # 空閒的物理內存的大小
buff # 已用的buff大小,對塊設備的讀寫進行緩衝
cache # cache直接用來記憶咱們打開的文件,給文件作緩衝,(把空閒的物理內存的一部分拿來作文件和目錄的緩存,是爲了提升 程序執行的性能,當程序使用內存時,buffer/cached會很快地被使用。)
inact # 非活躍內存大小,即被標明可回收的內存,區別於free和active -a選項時顯示
active # 活躍的內存大小 -a選項時顯示
si # 每秒從磁盤讀入虛擬內存的大小,若是這個值大於0,表示物理內存不夠用或者內存泄露,要查找耗內存進程解決掉。
so # 每秒虛擬內存寫入磁盤的大小,若是這個值大於0,同上。
bi # 塊設備每秒接收的塊數量,這裏的塊設備是指系統上全部的磁盤和其餘塊設備,默認塊大小是1024byte
bo # 塊設備每秒發送的塊數量,例如讀取文件,bo就要大於0。bi和bo通常都要接近0,否則就是IO過於頻繁,須要調整。
in # 每秒CPU的中斷次數,包括時間中斷。in和cs這兩個值越大,會看到由內核消耗的cpu時間會越多
cs # 每秒上下文切換次數,例如咱們調用系統函數,就要進行上下文切換,線程的切換,也要進程上下文切換,這個值要越小越好,太大了,要考慮調低線程或者進程的數目,例如在apache和nginx這種web服務器中,咱們通常作性能測試時會進行幾千併發甚至幾萬併發的測試,選擇web服務器的進程能夠由進程或者線程的峯值一直下調,壓測,直到cs到一個比較小的值,這個進程和線程數就是比較合適的值了。系統調用也是,每次調用系統函數,咱們的代碼就會進入內核空間,致使上下文切換,這個是很耗資源,也要儘可能避免頻繁調用系統函數。上下文切換次數過多表示你的CPU大部分浪費在上下文切換,致使CPU幹正經事的時間少了,CPU沒有充分利用。
us # 用戶進程執行消耗cpu時間(user time) us的值比較高時,說明用戶進程消耗的cpu時間多,可是若是長期超過50%的使用,那麼咱們就該考慮優化程序算法或其餘措施
sy # 系統CPU時間,若是過高,表示系統調用時間長,例如是IO操做頻繁。
id # 空閒 CPU時間,通常來講,id + us + sy = 100,通常認爲id是空閒CPU使用率,us是用戶CPU使用率,sy是系統CPU使用率。
wt # 等待IOCPU時間。Wa太高時,說明io等待比較嚴重,這多是因爲磁盤大量隨機訪問形成的,也有多是磁盤的帶寬出現瓶頸。

若是 r 常常大於4,且id常常少於40,表示cpu的負荷很重。
若是 pi po 長期不等於0,表示內存不足。
若是 b 隊列常常大於3,表示io性能很差。

}

}

日誌管理{

history # 歷時命令默認1000條
HISTTIMEFORMAT="%Y-%m-%d %H:%M:%S " # 讓history命令顯示具體時間
history -c # 清除記錄命令
cat $HOME/.bash_history # 歷史命令記錄文件
lastb -a # 列出登陸系統失敗的用戶相關信息 清空二進制日誌記錄文件 echo > /var/log/btmp
last # 查看登錄過的用戶信息 清空二進制日誌記錄文件 echo > /var/log/wtmp 默認打開亂碼
who /var/log/wtmp # 查看登錄過的用戶信息
lastlog # 用戶最後登陸的時間
tail -f /var/log/messages # 系統日誌
tail -f /var/log/secure # ssh日誌

}

selinux{

sestatus -v # 查看selinux狀態
getenforce # 查看selinux模式
setenforce 0 # 設置selinux爲寬容模式(可避免阻止一些操做)
semanage port -l # 查看selinux端口限制規則
semanage port -a -t http_port_t -p tcp 8000 # 在selinux中註冊端口類型
vi /etc/selinux/config # selinux配置文件
SELINUX=enfoceing # 關閉selinux 把其修改成 SELINUX=disabled

}

查看剩餘內存{

free -m
#-/+ buffers/cache: 6458 1649
#6458M爲真實使用內存 1649M爲真實剩餘內存(剩餘內存+緩存+緩衝器)
#linux會利用全部的剩餘內存做爲緩存,因此要保證linux運行速度,就須要保證內存的緩存大小

}


查看剩餘內存{

free -m
#-/+ buffers/cache: 6458 1649
#6458M爲真實使用內存 1649M爲真實剩餘內存(剩餘內存+緩存+緩衝器)
#linux會利用全部的剩餘內存做爲緩存,因此要保證linux運行速度,就須要保證內存的緩存大小

}

系統信息{

uname -a # 查看Linux內核版本信息
cat /proc/version # 查看內核版本
cat /etc/issue # 查看系統版本
lsb_release -a # 查看系統版本 需安裝 centos-release
locale -a # 列出全部語系
locale # 當前環境變量中全部編碼
hwclock # 查看時間
who # 當前在線用戶
w # 當前在線用戶
whoami # 查看當前用戶名
logname # 查看初始登錄用戶名
uptime # 查看服務器啓動時間
sar -n DEV 1 10 # 查看網卡網速流量
dmesg # 顯示開機信息
lsmod # 查看內核模塊

}

終端提示顯示{

echo $PS1 # 環境變量控制提示顯示
PS1='[\u@ \H \w \A \@#]\$'
PS1='[\u@\h \W]\$'
export PS1='[\[\e[32m\]\[\e[31m\]\u@\[\e[36m\]\h \w\[\e[m\]]\$ ' # 高亮顯示終端

}

開機啓動模式{

vi /etc/inittab
id:3:initdefault: # 3爲多用戶命令
#ca::ctrlaltdel:/sbin/shutdown -t3 -r now # 註釋此行 禁止 ctrl+alt+del 關閉計算機

}

硬件信息{

more /proc/cpuinfo # 查看cpu信息
lscpu # 查看cpu信息
cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c # 查看cpu型號和邏輯核心數
getconf LONG_BIT # cpu運行的位數
cat /proc/cpuinfo | grep 'physical id' |sort| uniq -c # 物理cpu個數
cat /proc/cpuinfo | grep flags | grep ' lm ' | wc -l # 結果大於0支持64位
cat /proc/cpuinfo|grep flags # 查看cpu是否支持虛擬化 pae支持半虛擬化 IntelVT 支持全虛擬化
more /proc/meminfo # 查看內存信息
dmidecode # 查看全面硬件信息
dmidecode | grep "Product Name" # 查看服務器型號
dmidecode | grep -P -A5 "Memory\s+Device" | grep Size | grep -v Range # 查看內存插槽
cat /proc/mdstat # 查看軟raid信息
cat /proc/scsi/scsi # 查看Dell硬raid信息(IBM、HP須要官方檢測工具)
lspci # 查看硬件信息
lspci|grep RAID # 查看是否支持raid
lspci -vvv |grep Ethernet # 查看網卡型號
lspci -vvv |grep Kernel|grep driver # 查看驅動模塊
modinfo tg2 # 查看驅動版本(驅動模塊)
ethtool -i em1 # 查看網卡驅動版本
ethtool em1 # 查看網卡帶寬

}


終端快捷鍵{

Ctrl+A   # 行前
Ctrl+E   # 行尾
Ctrl+S   # 終端鎖屏
Ctrl+Q    # 解鎖屏
Ctrl+D    # 退出

}

定時任務{

at 5pm + 3 days /bin/ls # 單次定時任務 指定三天後下午5:00執行/bin/ls

crontab -e # 編輯週期任務
#分鐘 小時 天 月 星期 命令或腳本
1,30 1-3/2 * * * 命令或腳本 >> file.log 2>&1
echo "40 7 * * 2 /root/sh">>/var/spool/cron/root # 直接將命令寫入週期任務
crontab -l # 查看自動週期性任務
crontab -r # 刪除自動週期性任務
cron.deny和cron.allow # 禁止或容許用戶使用週期任務
service crond start|stop|restart # 啓動自動週期性服務
* * * * * echo "d" >>d$(date +\%Y\%m\%d).log # 讓定時任務直接生成帶日期的log 須要轉義%

}

date{

星期日[SUN] 星期一[MON] 星期二[TUE] 星期三[WED] 星期四[THU] 星期五[FRI] 星期六[SAT]
一月[JAN] 二月[FEB] 三月[MAR] 四月[APR] 五月[MAY] 六月[JUN] 七月[JUL] 八月[AUG] 九月[SEP] 十月[OCT] 十一月[NOV] 十二月[DEC]

date -s 20091112 # 設日期
date -s 18:30:50 # 設時間
date -d "7 days ago" +%Y%m%d # 7天前日期
date -d "5 minute ago" +%H:%M # 5分鐘前時間
date -d "1 month ago" +%Y%m%d # 一個月前
date -d '1 days' +%Y-%m-%d # 一天後
date -d '1 hours' +%H:%M:%S # 一小時後
date +%Y-%m-%d -d '20110902' # 日期格式轉換
date +%Y-%m-%d_%X # 日期和時間
date +%N # 納秒
date -d "2012-08-13 14:00:23" +%s # 換算成秒計算(1970年至今的秒數)
date -d "@1363867952" +%Y-%m-%d-%T # 將時間戳換算成日期
date -d "1970-01-01 UTC 1363867952 seconds" +%Y-%m-%d-%T # 將時間戳換算成日期
date -d "`awk -F. '{print $1}' /proc/uptime` second ago" +"%Y-%m-%d %H:%M:%S" # 格式化系統啓動時間(多少秒前)

}

limits.conf{

ulimit -SHn 65535 # 臨時設置文件描述符大小 進程最大打開文件柄數 還有socket最大鏈接數, 等同配置 nofile
ulimit -SHu 65535 # 臨時設置用戶最大進程數
ulimit -a # 查看

/etc/security/limits.conf

# 文件描述符大小 open files
# lsof |wc -l 查看當前文件句柄數使用數量
* soft nofile 16384 # 設置太大,進程使用過多會把機器拖死
* hard nofile 32768

# 用戶最大進程數 max user processes
# echo $((`ps uxm |wc -l`-`ps ux |wc -l`)) 查看當前用戶佔用的進程數 [包括線程]
user soft nproc 16384
user hard nproc 32768

# 若是/etc/security/limits.d/有配置文件,將會覆蓋/etc/security/limits.conf裏的配置
# 即/etc/security/limits.d/的配置文件裏就不要有一樣的參量設置
/etc/security/limits.d/90-nproc.conf # centos6.3的默認這個文件會覆蓋 limits.conf
user soft nproc 16384
user hard nproc 32768

sysctl -p # 修改配置文件後讓系統生效

}

隨機分配端口範圍{

# 本機連其它端口用的
echo "10000 65535" > /proc/sys/net/ipv4/ip_local_port_range

}

百萬長連接設置{

# 內存消耗須要較大
vim /root/.bash_profile
# 添加以下2行,退出bash從新登錄
# 一個進程不能使用超過NR_OPEN文件描述符
echo 20000500 > /proc/sys/fs/nr_open
# 當前用戶最大文件數
ulimit -n 10000000

}

libc.so故障修復{

# 因爲升級glibc致使libc.so不穩定,忽然報錯,幸虧還有未退出的終端
grep: error while loading shared libraries: /lib64/libc.so.6: ELF file OS ABI invalid

# 看看當前系統有多少版本 libc.so
ls /lib64/libc-[tab]

# 更改環境變量指向其餘 libc.so 文件測試
export LD_PRELOAD=/lib64/libc-2.7.so # 若是不改變LD_PRELOAD變量,ln不能用,須要使用 /sbin/sln 命令作連接

# 當前若是好使了,在執行下面強制替換軟連接。如很差使,測試其餘版本的libc.so文件
ln -f -s /lib64/libc-2.7.so /lib64/libc.so.6

}

sudo{

echo myPassword | sudo -S ls /tmp # 直接輸入sudo的密碼非交互,從標準輸入讀取密碼而不是終端設備
visudo # sudo命令權限添加 /etc/sudoers
用戶 別名(可用all)=NOPASSWD:命令1,命令2
user ALL=NOPASSWD:/bin/su # 免root密碼切換root身份
wangming linuxfan=NOPASSWD:/sbin/apache start,/sbin/apache restart
UserName ALL=(ALL) ALL
UserName ALL=(ALL) NOPASSWD: ALL
peterli ALL=(ALL) NOPASSWD:/sbin/service
Defaults requiretty # sudo不容許後臺運行,註釋此行既容許
Defaults !visiblepw # sudo不容許遠程,去掉!既容許

}

服務{

/etc/init.d/sendmail start # 啓動服務
/etc/init.d/sendmail stop # 關閉服務
/etc/init.d/sendmail status # 查看服務當前狀態
/date/mysql/bin/mysqld_safe --user=mysql & # 啓動mysql後臺運行
/bin/systemctl restart mysqld.service # centos7啓動服務
vi /etc/rc.d/rc.local # 開機啓動執行 可用於開機啓動腳本
/etc/rc.d/rc3.d/S55sshd # 開機啓動和關機關閉服務鏈接 # S開機start K關機stop 55級別 後跟服務名
ln -s -f /date/httpd/bin/apachectl /etc/rc.d/rc3.d/S15httpd # 將啓動程序腳本鏈接到開機啓動目錄
ipvsadm -ln # lvs查看後端負載機併發
ipvsadm -C # lvs清除規則
xm list # 查看xen虛擬主機列表
virsh # 虛擬化(xen\kvm)管理工具 yum groupinstall Virtual*
./bin/httpd -M # 查看httpd加載模塊
httpd -t -D DUMP_MODULES # rpm包httpd查看加載模塊
echo 內容| /bin/mail -s "標題" 收件箱 -f 發件人 # 發送郵件
"`echo "內容"|iconv -f utf8 -t gbk`" | /bin/mail -s "`echo "標題"|iconv -f utf8 -t gbk`" 收件箱 # 解決郵件亂碼
/usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg # 檢測nagios配置文件

chkconfig{

chkconfig service on|off|set # 設置非獨立服務啓狀態
chkconfig --level 35 httpd off # 讓服務不自動啓動
chkconfig --level 35 httpd on # 讓服務自動啓動 35指的是運行級別
chkconfig --list # 查看全部服務的啓動狀態
chkconfig --list |grep httpd # 查看某個服務的啓動狀態
chkconfig –-list [service] # 查看服務的狀態

}

systemctl{

systemctl is-active *.service # 查看服務是否運行
systemctl is-enabled *.service # 查詢服務是否開機啓動
systemctl mask *.service # 註銷指定服務
systemctl unmask cups.service # 取消註銷cups服務
systemctl enable *.service # 開機運行服務
systemctl disable *.service # 取消開機運行
systemctl start *.service # 啓動服務
systemctl stop *.service # 中止服務
systemctl restart *.service # 重啓服務
systemctl reload *.service # 從新加載服務配置文件
systemctl status *.service # 查詢服務運行狀態
systemctl --failed # 顯示啓動失敗的服務
systemctl poweroff # 系統關機
systemctl reboot # 從新啓動
systemctl rescue # 強制進入救援模式
systemctl emergency # 強制進入緊急救援模式
systemctl list-dependencies # 查看當前運行級別target(mult-user)啓動了哪些服務
systemctl list-unit-files # 查看開機啓動的狀態
journalctl -r -u elasticsearch.service # 查看日誌 r倒序 u服務名
/etc/systemd/system/falcon-agent.service
[Unit]
Description=This is zuiyou monitor agent
After=network.target remote-fs.target nss-lookup.target

[Service]
User= root
Type=simple
PIDFile=/opt/falcon-agent/var/app.pid
ExecStartPre=/usr/bin/rm -f /opt/falcon-agent/var/app.pid
ExecStart=/opt/falcon-agent/control start
ExecReload=/bin/kill -s HUP $MAINPID
KillMode=process
KillSignal=SIGQUIT
TimeoutStopSec=5
PrivateTmp=true
Restart=always
LimitNOFILE=infinity

[Install]
WantedBy=multi-user.target

systemctl daemon-reload # 加載配置

}

}

nginx{

yum install -y make gcc openssl-devel pcre-devel bzip2-devel libxml2 libxml2-devel curl-devel libmcrypt-devel libjpeg libjpeg-devel libpng libpng-devel openssl

groupadd nginx
useradd nginx -g nginx -M -s /sbin/nologin

mkdir -p /opt/nginx-tmp

wget http://labs.frickle.com/files/ngx_cache_purge-1.6.tar.gz
tar fxz ngx_cache_purge-1.6.tar.gz
# ngx_cache_purge 清除指定url緩存
# 假設一個URL爲 http://192.168.12.133/test.txt
# 經過訪問 http://192.168.12.133/purge/test.txt 就能夠清除該URL的緩存。

tar zxvpf nginx-1.4.4.tar.gz
cd nginx-1.4.4

# ./configure --help
# --with # 默認不加載 需指定編譯此參數才使用
# --without # 默認加載,可用此參數禁用
# --add-module=path # 添加模塊的路徑
# --add-module=/opt/ngx_module_upstream_check \ # nginx 代理狀態頁面
# ngx_module_upstream_check 編譯前須要打對應版本補丁 patch -p1 < /opt/nginx_upstream_check_module/check_1.2.6+.patch
# --add-module=/opt/ngx_module_memc \ # 將請求頁面數據存放在 memcached中
# --add-module=/opt/ngx_module_lua \ # 支持lua腳本 yum install lua-devel lua

./configure \
--user=nginx \
--group=nginx \
--prefix=/usr/local/nginx \
--with-http_ssl_module \
--with-http_realip_module \
--with-http_gzip_static_module \
--with-http_stub_status_module \
--add-module=/opt/ngx_cache_purge-1.6 \
--http-client-body-temp-path=/opt/nginx-tmp/client \
--http-proxy-temp-path=/opt/nginx-tmp/proxy \
--http-fastcgi-temp-path=/opt/nginx-tmp/fastcgi \
--http-uwsgi-temp-path=/opt/nginx-tmp/uwsgi \
--http-scgi-temp-path=/opt/nginx-tmp/scgi

make && make install

/usr/local/nginx/sbin/nginx –t # 檢查Nginx配置文件 但並不執行
/usr/local/nginx/sbin/nginx -t -c /opt/nginx/conf/nginx.conf # 檢查Nginx配置文件
/usr/local/nginx/sbin/nginx # 啓動nginx
/usr/local/nginx/sbin/nginx -s reload # 重載配置
/usr/local/nginx/sbin/nginx -s stop # 關閉nginx服務

}

elasticsearch{

vim /etc/sysctl.conf
vm.max_map_count = 262144

vim /etc/security/limits.conf
* soft memlock unlimited
* hard memlock unlimited
sysctl -p

curl 'localhost:9200/_cat/health?v' # 健康檢查
curl 'localhost:9200/_cat/nodes?v' # 獲取集羣的節點列表
curl 'localhost:9200/_cat/indices?v' # 列出全部索引
curl 127.0.0.1:9200/indexname -XDELETE # 刪除索引
curl -XGET http://localhost:9200/_cat/shards # 查看分片
curl '127.0.0.1:9200/_cat/indices' # 查分片同步 unassigned_shards # 沒同步完成

}

 

mysql經常使用命令{

# mysql 可視化工具 MySQL Workbench

mysqlcheck -uroot -p -S mysql.sock --optimize --databases account # 檢查、修復、優化MyISAM表
mysqlbinlog slave-relay-bin.000001 # 查看二進制日誌
mysqladmin -h myhost -u root -p create dbname # 建立數據庫

flush privileges; # 刷新
show databases; # 顯示全部數據庫
use dbname; # 打開數據庫
show tables; # 顯示選中數據庫中全部的表
desc tables; # 查看錶結構
drop database name; # 刪除數據庫
drop table name; # 刪除表
create database name; # 建立數據庫
select column from table; # 查詢
show processlist; # 查看mysql進程
show full processlist; # 顯示進程全的語句
select user(); # 查看全部用戶
show slave status\G; # 查看主從狀態
show variables; # 查看全部參數變量
show status; # 運行狀態
show table status # 查看錶的引擎狀態
show grants for user@'%' # 查看用戶權限
drop table if exists user # 表存在就刪除
create table if not exists user # 表不存在就建立
select host,user,password from user; # 查詢用戶權限 先use mysql
create table ka(ka_id varchar(6),qianshu int); # 建立表
show variables like 'character_set_%'; # 查看系統的字符集和排序方式的設定
show variables like '%timeout%'; # 查看超時相關參數
delete from user where user=''; # 刪除空用戶
delete from user where user='sss' and host='localhost' ; # 刪除用戶
drop user 'sss'@'localhost'; # 使用此方法刪除用戶更爲靠譜
ALTER TABLE mytable ENGINE = MyISAM ; # 改變現有的表使用的存儲引擎
SHOW TABLE STATUS from dbname where Name='tablename'; # 查詢表引擎
mysql -uroot -p -A -ss -h10.10.10.5 -e "show databases;" # shell中獲取數據不帶表格 -ss參數
CREATE TABLE innodb (id int, title char(20)) ENGINE = INNODB # 建立表指定存儲引擎的類型(MyISAM或INNODB)
grant replication slave on *.* to 'user'@'%' identified by 'pwd'; # 建立主從複製用戶
ALTER TABLE player ADD INDEX weekcredit_faction_index (weekcredit, faction); # 添加索引
alter table name add column accountid(column) int(11) NOT NULL(column); # 插入字段
update host set monitor_state='Y',hostname='xuesong' where ip='192.168.1.1'; # 更新數據
select * from information_schema.processlist where command!='sleep'; # 查看當前進程
select * from atable where name='on' AND t<15 AND host LIKE '10%' limit 1,10; # 多條件查詢
show create database ops_deploy; # 查看數據庫編碼
show create table updatelog; # 查看數據庫表編碼
alter database ops_deploy CHARACTER SET utf8; # 修改數據庫編碼
alter table `updatelog` default character set utf8; # 修改表編碼
alter table `updatelog` convert to character set utf8; # 修改一張表的全部字段的編碼格式

自增表{

create table xuesong (id INTEGER PRIMARY KEY AUTO_INCREMENT, name CHAR(30) NOT NULL, age integer , sex CHAR(15) ); # 建立自增表
insert into xuesong(name,age,sex) values(%s,%s,%s) # 自增插入數據

}

登陸mysql的命令{

# 格式: mysql -h 主機地址 -u 用戶名 -p 用戶密碼
mysql -h110.110.110.110 -P3306 -uroot -p
mysql -uroot -p -S /data1/mysql5/data/mysql.sock -A --default-character-set=GBK

}

shell執行mysql命令{

mysql -u root -p'123' xuesong < file.sql # 針對指定庫執行sql文件中的語句,好處不須要轉義特殊符號,一條語句能夠換行.不指定庫執行時語句中須要先use
mysql -u$username -p$passwd -h$dbhost -P$dbport -A -e "
use $dbname;
delete from data where date=('$date1');
" # 執行多條mysql命令
mysql -uroot -p -S mysql.sock -e "use db;alter table gift add column accountid int(11) NOT NULL;flush privileges;" 2>&1 |grep -v Warning # 不登錄mysql插入字段

}


mysql字符集相關{

show variables like '%character%'; # 查看數據庫中設置字符集的參數
# character_set_client、character_set_connection 以及 character_set_results 這幾個參數都是客戶端的設置
# character_set_system、character_set_server 以及 character_set_database 是指服務器端的設置。
# 而對於這三個服務器端的參數來講的優先級是:
# 列級字符集 > 表級字符集 > character_set_database > character_set_server > character_set_system

show global variables like '%char%'; #查看RDS實例字符集相關參數設置
show global variables like 'coll%'; #查看當前會話字符序相關參數設置
show character set; #查看實例支持的字符集
show collation; #查看實例支持的字符序
show create table table_name \G #查看錶字符集設置
show create database database_name \G #查看數據庫字符集設置
show create procedure procedure_name \G #查看存儲過程字符集設置
show procedure status \G #查看存儲過程字符集設置
alter database db_name default charset utf8; #修改數據庫的字符集 
create database db_name character set utf8; #建立數據庫時指定字符集
alter table tab_name default charset utf8 collate utf8_general_ci; #修改表字符集和字符序

# 下面三條sql 分別將庫 dbsdq , 表 tt2 , 表 tt2 中的 c2 列修改成utf8mb4 字符集
alter database dbsdq character set utf8mb4 collate utf8mb4_unicode_ci;
use dbsdq;
alter table tt2 character set utf8mb4 collate utf8mb4_unicode_ci;
alter table tt2 modify c2 varchar(10) character set utf8mb4;
# 修改列時,當前列中的全部行都會當即轉化爲新的字符集;
# alter table 會對錶加元數據鎖

}

備份數據庫{

mysqldump -h host -u root -p --default-character-set=utf8 dbname >dbname_backup.sql # 不包括庫名,還原需先建立庫,在use
mysqldump -h host -u root -p --database --default-character-set=utf8 dbname >dbname_backup.sql # 包括庫名,還原不須要建立庫
/bin/mysqlhotcopy -u root -p # mysqlhotcopy只能備份MyISAM引擎
mysqldump -u root -p -S mysql.sock --default-character-set=utf8 dbname table1 table2 > /data/db.sql # 備份表
mysqldump -uroot -p123 -d database > database.sql # 備份數據庫結構

# 最小權限備份
grant select on db_name.* to dbbackup@"localhost" Identified by "passwd";
# --single-transaction InnoDB有時間戳 只備份開始那一刻的數據,備份過程當中的數據不會備份
mysqldump -hlocalhost -P 3306 -u dbbackup --single-transaction -p"passwd" --database dbname >dbname.sql

# xtrabackup備份需單獨安裝軟件 優勢: 速度快,壓力小,可直接恢復主從複製
innobackupex --user=root --password="" --defaults-file=/data/mysql5/data/my_3306.cnf --socket=/data/mysql5/data/mysql.sock --slave-info --stream=tar --tmpdir=/data/dbbackup/temp /data/dbbackup/ 2>/data/dbbackup/dbbackup.log | gzip 1>/data/dbbackup/db50.tar.gz

}

還原數據庫{

mysql -h host -u root -p dbname < dbname_backup.sql
source 路徑.sql # 登錄mysql後還原sql文件

}

賦權限{

# 指定IP: $IP 本機: localhost 全部IP地址: % # 一般指定多條
grant all on zabbix.* to user@"$IP"; # 對現有帳號賦予權限
grant select on database.* to user@"%" Identified by "passwd"; # 賦予查詢權限(沒有用戶,直接建立)
grant all privileges on database.* to user@"$IP" identified by 'passwd'; # 賦予指定IP指定用戶全部權限(不容許對當前庫給其餘用戶賦權限)
grant all privileges on database.* to user@"localhost" identified by 'passwd' with grant option; # 賦予本機指定用戶全部權限(容許對當前庫給其餘用戶賦權限)
grant select, insert, update, delete on database.* to user@'ip'identified by "passwd"; # 開放管理操做指令
revoke all on *.* from user@localhost; # 回收權限
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER, EXECUTE, CREATE ROUTINE, ALTER ROUTINE ON `storemisc_dev`.* TO 'user'@'192.168.%'

}

更改密碼{

update user set password=password('passwd') where user='root'
mysqladmin -u root password 'xuesong'

}

mysql忘記密碼後重置{

cd /data/mysql5
/data/mysql5/bin/mysqld_safe --user=mysql --skip-grant-tables --skip-networking &
use mysql;
update user set password=password('123123') where user='root';

}

mysql主從複製失敗恢復{

slave stop;
reset slave;
change master to master_host='10.10.10.110',master_port=3306,master_user='repl',master_password='repl',master_log_file='master-bin.000010',master_log_pos=107,master_connect_retry=60;
slave start;

}

sql語句使用變量{

use xuesong;
set @a=concat('my',weekday(curdate())); # 組合時間變量
set @sql := concat('CREATE TABLE IF NOT EXISTS ',@a,'( id INT(11) NOT NULL )'); # 組合sql語句
select @sql; # 查看語句
prepare create_tb from @sql; # 準備
execute create_tb; # 執行

}

檢測mysql主從複製延遲{

一、在從庫定時執行更新主庫中的一個timeout數值
二、同時取出從庫中的timeout值對比判斷從庫與主庫的延遲

}

死鎖{

show OPEN TABLES where In_use > 0; # 查看當前鎖信息
show variables like 'innodb_print_all_deadlocks'; # 查看當前死鎖參數
set global innodb_print_all_deadlocks = 1; # 設置死鎖信息保存到錯誤日誌
innodb_print_all_deadlocks = 1 # conf配置

}

mysql慢查詢{

select * from information_schema.processlist where command in ('Query') and time >5\G # 查詢操做大於5S的進程

開啓慢查詢日誌{

# 配置文件 /etc/my.conf
[mysqld]
log-slow-queries=/var/lib/mysql/slowquery.log # 指定日誌文件存放位置,能夠爲空,系統會給一個缺省的文件host_name-slow.log
long_query_time=5 # 記錄超過的時間,默認爲10s 建議0.5S
log-queries-not-using-indexes # log下來沒有使用索引的query,能夠根據狀況決定是否開啓 可不加
log-long-format # 若是設置了,全部沒有使用索引的查詢也將被記錄 可不加
# 直接修改生效
show variables like "%slow%"; # 查看慢查詢狀態
set global slow_query_log='ON'; # 開啓慢查詢日誌 變量可能不一樣,看上句查詢出來的變量

}

mysqldumpslow慢查詢日誌查看{

-s # 是order的順序,包括看了代碼,主要有 c,t,l,r和ac,at,al,ar,分別是按照query次數,時間,lock的時間和返回的記錄數來排序,前面加了a的時倒序
-t # 是top n的意思,即爲返回前面多少條的數據
-g # 後邊能夠寫一個正則匹配模式,大小寫不敏感的

mysqldumpslow -s c -t 20 host-slow.log # 訪問次數最多的20個sql語句
mysqldumpslow -s r -t 20 host-slow.log # 返回記錄集最多的20個sql
mysqldumpslow -t 10 -s t -g "left join" host-slow.log # 按照時間返回前10條裏面含有左鏈接的sql語句

show global status like '%slow%'; # 查看如今這個session有多少個慢查詢
show variables like '%slow%'; # 查看慢查詢日誌是否開啓,若是slow_query_log和log_slow_queries顯示爲on,說明服務器的慢查詢日誌已經開啓
show variables like '%long%'; # 查看超時閥值
desc select * from wei where text='xishizhaohua'\G; # 掃描整張表 tepe:ALL 沒有使用索引 key:NULL
create index text_index on wei(text); # 建立索引

}

Percona Toolkit 慢日誌分析工具

}

mysql操做次數查詢{

select * from information_schema.global_status;

com_select
com_delete
com_insert
com_update

}

}


JDK安裝{

vim /etc/profile.d/jdk.sh
export JAVA_HOME=/usr/local/jdk1.8.0_151
export PATH=$JAVA_HOME/bin:$PATH

. /etc/profile # 加載新的環境變量
jps -ml # 查看java進程
}

redis動態加內存{

./redis-cli -h 10.10.10.11 -p 6401
save # 保存當前快照
config get * # 列出全部當前配置
config get maxmemory # 查看指定配置
config set maxmemory 15360000000 # 動態修改最大內存配置參數

}

nfs{

# 依賴rpc服務通訊 portmap[centos5] 或 rpcbind[centos6]
yum install nfs-utils portmap # centos5安裝
yum install nfs-utils rpcbind # centos6安裝

vim /etc/exports # 配置文件
# sync # 同步寫入
# async # 暫存並不是直接寫入
# no_root_squash # 開放用戶端使用root身份操做
# root_squash # 使用者身份爲root則被壓縮成匿名使用,即nobody,相對安全
# all_squash # 全部NFS的使用者身份都被壓縮爲匿名
/data/images 10.10.10.0/24(rw,sync,no_root_squash)

service portmap restart # 重啓centos5的nfs依賴的rpc服務
service rpcbind restart # 重啓centos6的nfs依賴的rpc服務
service nfs restart # 重啓nfs服務 確保依賴 portmap 或 rpcbind 服務已啓動
service nfs reload # 重載NFS服務配置文件
showmount -e # 服務端查看本身共享的服務
showmount -a # 顯示已經與客戶端鏈接上的目錄信息
showmount -e 10.10.10.3 # 列出服務端可供使用的NFS共享 客戶端測試可否訪問nfs服務
mount -t nfs 10.10.10.3:/data/images/ /data/img # 掛載nfs 若是延遲影響大加參數 noac

# 服務端的 portmap 或 rpcbind 被中止後,nfs仍然工做正常,可是umout財會提示: not found / mounted or server not reachable 重啓服務器的portmap 或 rpcbind 也無濟於事。 nfs也要跟着重啓,不然nfs工做仍然是不正常的。
# 同時已掛載會形成NFS客戶端df卡住和掛載目錄沒法訪問。請先用 mount 查看當前掛載狀況,記錄掛載信息,在強制卸載掛載目錄,從新掛載
umount -f /data/img/ # 強制卸載掛載目錄 如還不能夠 umount -l /data/img/

nfsstat -c # 客戶機發送和拒絕的RPC和NFS調用數目的信息
nfsstat -cn # 顯示和打印與客戶機NFS調用相關的信息
nfsstat -r # 顯示和打印客戶機和服務器的與RPC調用相關的信息
nfsstat –s # 顯示關於服務器接收和拒絕的RPC和NFS調用數目的信息

}


hdfs{
hdfs --help # 全部參數

hdfs dfs -help # 運行文件系統命令在Hadoop文件系統
hdfs dfs -ls /logs # 查看
hdfs dfs -ls /user/ # 查看用戶
hdfs dfs -cat
hdfs dfs -df
hdfs dfs -du
hdfs dfs -rm
hdfs dfs -tail
hdfs dfs –put localSrc dest # 上傳文件

hdfs dfsadmin -help # hdfs集羣節點管理
hdfs dfsadmin -report # 基本的文件系通通計信息
}

}

網絡{

rz # 經過ssh上傳小文件
sz # 經過ssh下載小文件
ifconfig eth0 down # 禁用網卡
ifconfig eth0 up # 啓用網卡
ifup eth0:0 # 啓用網卡
mii-tool em1 # 查看網線是否鏈接
traceroute www.baidu.com # 測試跳數
vi /etc/resolv.conf # 設置DNS nameserver IP 定義DNS服務器的IP地址
nslookup www.moon.com # 解析域名IP
dig -x www.baidu.com # 解析域名IP
dig +trace -t A domainname # 跟蹤dns
dig +short txt hacker.wp.dg.cx # 經過 DNS 來讀取 Wikipedia 的hacker詞條
host -t txt hacker.wp.dg.cx # 經過 DNS 來讀取 Wikipedia 的hacker詞條
lynx # 文本上網
wget -P path -O name url # 下載 包名:wgetrc -q 安靜 -c 續傳
dhclient eth1 # 自動獲取IP
mtr -r www.baidu.com # 測試網絡鏈路節點響應時間 # trace ping 結合
ipcalc -m "$ip" -p "$num" # 根據IP和主機最大數計算掩碼
curl -I www.baidu.com # 查看網頁http頭
curl -s www.baidu.com # 不顯示進度
queryperf -d list -s DNS_IP -l 2 # BIND自帶DNS壓力測試 [list 文件格式:www.turku.fi A]
telnet ip port # 測試端口是否開放,有些服務可直接輸入命令獲得返回狀態
echo "show " |nc $ip $port # 適用於telnet一類登陸獲得命令返回
nc -l -p port # 監聽指定端口
nc -nv -z 10.10.10.11 1080 |grep succeeded # 檢查主機端口是否開放
curl -o /dev/null -s -m 10 --connect-timeout 10 -w %{http_code} $URL # 檢查頁面狀態
curl -X POST -d "user=xuesong&pwd=123" http://www.abc.cn/Result # 提交POST請求
curl -s http://20140507.ip138.com/ic.asp # 經過IP138取本機出口外網IP
curl http://IP/ -H "X-Forwarded-For: ip" -H "Host: www.ttlsa.com" # 連到指定IP的響應主機,HTTPserver只看 Host字段
ifconfig eth0:0 192.168.1.221 netmask 255.255.255.0 # 增長邏輯IP地址
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all # 禁ping
net rpc shutdown -I IP_ADDRESS -U username%password # 遠程關掉一臺WINDOWS機器
wget --random-wait -r -p -e robots=off -U Mozilla www.example.com # 遞歸方式下載整個網站
sshpass -p "$pwd" rsync -avzP /dir user@$IP:/dir/ # 指定密碼避免交互同步目錄
rsync -avzP --delete /dir user@$IP:/dir # 無差同步目錄 能夠快速清空大目錄
rsync -avzP -e "ssh -p 22 -e -o StrictHostKeyChecking=no" /dir user@$IP:/dir # 指定ssh參數同步

}

抓包{

-i eth1 # 只抓通過接口eth1的包
-t # 不顯示時間戳
-s 0 # 抓取數據包時默認抓取長度爲68字節。加上-S 0 後能夠抓到完整的數據包
-c 100 # 只抓取100個數據包
dst port ! 22 # 不抓取目標端口是22的數據包
tcpdump tcp port 22 # 抓包
tcpdump -n -vv udp port 53 # 抓udp的dns包 並顯示ip
tcpdump port 10001 -A -s0 # 完整顯示ascii數據包

}

網卡流量查看{

watch more /proc/net/dev # 實時監控流量文件系統 累計值
iptraf # 網卡流量查看工具
nethogs -d 5 eth0 eth1 # 按進程實時統計網絡流量 epel源nethogs
iftop -i eth0 -n -P # 實時流量監控

sar {
-n參數有6個不一樣的開關: DEV | EDEV | NFS | NFSD | SOCK | ALL
DEV顯示網絡接口信息
EDEV顯示關於網絡錯誤的統計數據
NFS統計活動的NFS客戶端的信息
NFSD統計NFS服務器的信息
SOCK顯示套 接字信息
ALL顯示全部5個開關

sar -n DEV 1 10

rxpck/s # 每秒鐘接收的數據包
txpck/s # 每秒鐘發送的數據包
rxbyt/s # 每秒鐘接收的字節數
txbyt/s # 每秒鐘發送的字節數
rxcmp/s # 每秒鐘接收的壓縮數據包
txcmp/s # 每秒鐘發送的壓縮數據包
rxmcst/s # 每秒鐘接收的多播數據包

}

}

netstat{

# 幾十萬併發的狀況下netstat會沒有響應,建議使用 ss 命令
-a # 顯示全部鏈接中的Socket
-t # 顯示TCP鏈接
-u # 顯示UDP鏈接
-n # 顯示全部已創建的有效鏈接
netstat -anlp # 查看連接
netstat -tnlp # 只查看tcp監聽端口
netstat -r # 查看路由表
}

ss{

# netstat是遍歷/proc下面每一個PID目錄,ss直接讀/proc/net下面的統計信息。因此ss執行的時候消耗資源以及消耗的時間都比netstat少不少
ss -s # 列出當前socket詳細信息
ss -l # 顯示本地打開的全部端口
ss -tnlp # 顯示每一個進程具體打開的socket
ss -ant # 顯示全部TCP socket
ss -u -a # 顯示全部UDP Socekt
ss dst 192.168.119.113 # 匹配遠程地址
ss dst 192.168.119.113:http # 匹配遠程地址和端口號
ss dst 192.168.119.113:3844 # 匹配遠程地址和端口號
ss src 192.168.119.103:16021 # 匹配本地地址和端口號
ss -o state established '( dport = :smtp or sport = :smtp )' # 顯示全部已創建的SMTP鏈接
ss -o state established '( dport = :http or sport = :http )' # 顯示全部已創建的HTTP鏈接
ss -x src /tmp/.X11-unix/* # 找出全部鏈接X服務器的進程

}

併發數查看{

netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
SYN_RECV # 正在等待處理的請求
ESTABLISHED # 正常數據傳輸狀態,既當前併發數
TIME_WAIT # 處理完畢,等待超時結束的請求
CLOSE_WAIT # 客戶端異常關閉,沒有完成4次揮手 如大量可能存在攻擊行爲

}

ssh{

ssh -p 22 user@192.168.1.209 # 從linux ssh登陸另外一臺linux
ssh -p 22 root@192.168.1.209 CMD # 利用ssh操做遠程主機
scp -P 22 file root@ip:/dir # 把本地文件拷貝到遠程主機
scp -l 100000 file root@ip:/dir # 傳輸文件到遠程,限制速度100M
sshpass -p 'pwd' ssh -n root@$IP "echo hello" # 指定密碼遠程操做
ssh -o StrictHostKeyChecking=no $IP # ssh鏈接不提示yes
ssh -t "su -" # 指定僞終端 客戶端以交互模式工做
scp root@192.168.1.209:/RemoteDir /localDir # 把遠程指定文件拷貝到本地
pscp -h host.ip /a.sh /opt/sbin/ # 批量傳輸文件
ssh -N -L2001:remotehost:80 user@somemachine # 用SSH建立端口轉發通道
ssh -t host_A ssh host_B # 嵌套使用SSH
ssh -t -p 22 $user@$Ip /bin/su - root -c {$Cmd}; # 遠程su執行命令 Cmd="\"/sbin/ifconfig eth0\""
ssh-keygen -t rsa # 生成密鑰
ssh-copy-id -i xuesong@10.10.10.133 # 傳送key
vi $HOME/.ssh/authorized_keys # 公鑰存放位置
sshfs name@server:/path/to/folder /path/to/mount/point # 經過ssh掛載遠程主機上的文件夾
fusermount -u /path/to/mount/point # 卸載ssh掛載的目錄
ssh user@host cat /path/to/remotefile | diff /path/to/localfile - # 用DIFF對比遠程文件跟本地文件
su - user -c "ssh user@192.168.1.1 \"echo -e aa |mail -s test mail@163.com\"" # 切換用戶登陸遠程發送郵件
pssh -h ip.txt -i uptime # 批量執行ssh yum install pssh

}

網卡配置文件{

vi /etc/sysconfig/network-scripts/ifcfg-eth0

DEVICE=eth0
BOOTPROTO=none
BROADCAST=192.168.1.255
HWADDR=00:0C:29:3F:E1:EA
IPADDR=192.168.1.55
NETMASK=255.255.255.0
NETWORK=192.168.1.0
ONBOOT=yes
TYPE=Ethernet
GATEWAY=192.168.1.1
#ARPCHECK=no # 進制arp檢查

}

route {

route # 查看路由表
route add default gw 192.168.1.1 dev eth0 # 添加默認路由
route add -net 172.16.0.0 netmask 255.255.0.0 gw 10.39.111.254 # 添加靜態路由網關
route del -net 172.16.0.0 netmask 255.255.0.0 gw 10.39.111.254 # 刪除靜態路由網關

}

靜態路由{

vim /etc/sysconfig/static-routes
any net 192.168.12.0/24 gw 192.168.0.254
any net 192.168.13.0/24 gw 192.168.0.254

}

解決ssh連接慢{

sed -i 's/GSSAPIAuthentication yes/GSSAPIAuthentication no/' /etc/ssh/sshd_config
sed -i '/#UseDNS yes/a\UseDNS no' /etc/ssh/sshd_config
/etc/init.d/sshd reload

}

nmap{

nmap -PT 192.168.1.1-111 # 先ping在掃描主機開放端口
nmap -O 192.168.1.1 # 掃描出系統內核版本
nmap -sV 192.168.1.1-111 # 掃描端口的軟件版本
nmap -sS 192.168.1.1-111 # 半開掃描(一般不會記錄日誌)
nmap -P0 192.168.1.1-111 # 不ping直接掃描
nmap -d 192.168.1.1-111 # 詳細信息
nmap -D 192.168.1.1-111 # 沒法找出真正掃描主機(隱藏IP)
nmap -p 20-30,139,60000- # 端口範圍 表示:掃描20到30號端口,139號端口以及全部大於60000的端口
nmap -P0 -sV -O -v 192.168.30.251 # 組合掃描(不ping、軟件版本、內核版本、詳細信息)

# 不支持windows的掃描(可用於判斷是不是windows)
nmap -sF 192.168.1.1-111
nmap -sX 192.168.1.1-111
nmap -sN 192.168.1.1-111

}

snmp{

snmptranslate .1.3.6.1.2.1.1.3.0 # 查看映射關係
DISMAN-EVENT-MIB::sysUpTimeInstance
snmpdf -v 1 -c public localhost # SNMP監視遠程主機的磁盤空間
snmpnetstat -v 2c -c public -a 192.168.6.53 # SNMP獲取指定IP的全部開放端口狀態
snmpwalk -v 2c -c public 10.152.14.117 .1.3.6.1.2.1.1.3.0 # SNMP獲取主機啓動時間
# MIB安裝(ubuntu)
# sudo apt-get install snmp-mibs-downloader
# sudo download-mibs
snmpwalk -v 2c -c public 10.152.14.117 sysUpTimeInstance # SNMP經過MIB庫獲取主機啓動時間

}


磁盤{

df -Ph # 查看硬盤容量
df -T # 查看磁盤分區格式
df -i # 查看inode節點 若是inode用滿後沒法建立文件
du -h dir # 檢測目錄下全部文件大小
du -sh * # 顯示當前目錄中子目錄的大小
mount -l # 查看分區掛載狀況
fdisk -l # 查看磁盤分區狀態
fdisk /dev/hda3 # 分區
mkfs -t ext3 /dev/hda3 # 格式化分區
fsck -y /dev/sda6 # 對文件系統修復
lsof |grep delete # 釋放進程佔用磁盤空間 列出進程後,查看文件是否存在,不存在則kill掉此進程
tmpwatch -afv 10 /tmp # 刪除10小時內未使用的文件 勿在重要目錄使用
cat /proc/filesystems # 查看當前系統支持文件系統
mount -o remount,rw / # 修改只讀文件系統爲讀寫
iotop # 進程佔用磁盤IO狀況 yum install iotop
smartctl -H /dev/sda # 檢測硬盤狀態 # yum install smartmontools
smartctl -i /dev/sda # 檢測硬盤信息
smartctl -a /dev/sda # 檢測全部信息
e2label /dev/sda5 # 查看卷標
e2label /dev/sda5 new-label # 建立卷標
ntfslabel -v /dev/sda8 new-label # NTFS添加捲標
tune2fs -j /dev/sda # ext2分區轉ext3分區
tune2fs -l /dev/sda # 查看文件系統信息
mke2fs -b 2048 /dev/sda5 # 指定索引塊大小
dumpe2fs -h /dev/sda5 # 查看超級塊的信息
mount -t iso9660 /dev/dvd /mnt # 掛載光驅
mount -t ntfs-3g /dev/sdc1 /media/yidong # 掛載ntfs硬盤
mount -t nfs 10.0.0.3:/opt/images/ /data/img # 掛載nfs 須要重載 /etc/init.d/nfs reload 重啓須要先啓動 portmap 服務
mount -o loop /software/rhel4.6.iso /mnt/ # 掛載鏡像文件

}

磁盤IO性能檢測{

iostat -x 1 10

% user # 顯示了在用戶級(應用程序)執行時生成的 CPU 使用率百分比。
% system # 顯示了在系統級(內核)執行時生成的 CPU 使用率百分比。
% idle # 顯示了在 CPU 空閒而且系統沒有未完成的磁盤 I/O 請求時的時間百分比。
% iowait # 顯示了 CPU 空閒期間系統有未完成的磁盤 I/O 請求時的時間百分比。

rrqm/s # 每秒進行 merge 的讀操做數目。即 delta(rmerge)/s
wrqm/s # 每秒進行 merge 的寫操做數目。即 delta(wmerge)/s
r/s # 每秒完成的讀 I/O 設備次數。即 delta(rio)/s
w/s # 每秒完成的寫 I/O 設備次數。即 delta(wio)/s
rsec/s # 每秒讀扇區數。即 delta(rsect)/s
wsec/s # 每秒寫扇區數。即 delta(wsect)/s
rkB/s # 每秒讀K字節數。是 rsect/s 的一半,由於每扇區大小爲512字節。(須要計算)
wkB/s # 每秒寫K字節數。是 wsect/s 的一半。(須要計算)
avgrq-sz # 平均每次設備I/O操做的數據大小 (扇區)。delta(rsect+wsect)/delta(rio+wio)
avgqu-sz # 平均I/O隊列長度。即 delta(aveq)/s/1000 (由於aveq的單位爲毫秒)。
await # 平均每次設備I/O操做的等待時間 (毫秒)。即 delta(ruse+wuse)/delta(rio+wio)
svctm # 平均每次設備I/O操做的服務時間 (毫秒)。即 delta(use)/delta(rio+wio)
%util # 一秒中有百分之多少的時間用於 I/O 操做,或者說一秒中有多少時間 I/O 隊列是非空的。即 delta(use)/s/1000 (由於use的單位爲毫秒)

IO性能衡量標準{

一、 若是 %util 接近 100%,說明產生的I/O請求太多,I/O系統已經滿負荷,該磁盤可能存在瓶頸。
二、 idle 小於70% IO壓力就較大了,通常讀取速度有較多的wait.
三、 同時能夠結合 vmstat 查看查看b參數(等待資源的進程數)和wa參數(IO等待所佔用的CPU時間的百分比,高過30%時IO壓力高)
四、 svctm 通常要小於 await (由於同時等待的請求的等待時間被重複計算了),svctm 的大小通常和磁盤性能有關,CPU/內存的負荷也會對其有影響,請求過多也會間接致使 svctm 的增長. await 的大小通常取決於服務時間(svctm) 以及 I/O 隊列的長度和 I/O 請求的發出模式. 若是 svctm 比較接近 await,說明 I/O 幾乎沒有等待時間;若是 await 遠大於 svctm,說明 I/O 隊列太長,應用獲得的響應時間變慢,若是響應時間超過了用戶能夠允許的範圍,這時能夠考慮更換更快的磁盤,調整內核 elevator 算法,優化應用,或者升級 CPU
五、 隊列長度(avgqu-sz)也可做爲衡量系統 I/O 負荷的指標,但因爲 avgqu-sz 是按照單位時間的平均值,因此不能反映瞬間的 I/O 洪水。

}

}

iotop{

# 監視進程磁盤I/O

yum install iotop

-o # 只顯示有io操做的進程
-b # 批量顯示,無交互,主要用做記錄到文件。
-n NUM # 顯示NUM次,主要用於非交互式模式。
-d SEC # 間隔SEC秒顯示一次。
-p PID # 監控的進程pid。
-u USER # 監控的進程用戶。

# 左右箭頭:改變排序方式,默認是按IO排序。
r # 改變排序順序。
o # 只顯示有IO輸出的進程。
p # 進程/線程的顯示方式的切換。
a # 顯示累積使用量。
q # 退出。

}

建立swap文件方法{

dd if=/dev/zero of=/swap bs=1024 count=4096000 # 建立一個足夠大的文件
# count的值等於1024 x 你想要的文件大小, 4096000是4G
mkswap /swap # 把這個文件變成swap文件
swapon /swap # 啓用這個swap文件
/swap swap swap defaults 0 0 # 在每次開機的時候自動加載swap文件, 須要在 /etc/fstab 文件中增長一行
cat /proc/swaps # 查看swap
swapoff -a # 關閉swap
swapon -a # 開啓swap

}

新硬盤掛載{

fdisk /dev/sdc
p # 打印分區
d # 刪除分區
n # 建立分區,(一塊硬盤最多4個主分區,擴展佔一個主分區位置。p主分區 e擴展)
w # 保存退出
mkfs.ext4 -L 卷標 /dev/sdc1 # 格式化相應分區
mount /dev/sdc1 /mnt # 掛載
vi /etc/fstab # 添加開機掛載分區
LABEL=/data /data ext4 defaults 1 2 # 用卷標掛載
/dev/sdb1 /data4 ext4 defaults 1 2 # 用真實分區掛載
/dev/sdb2 /data4 ext4 noatime,defaults 1 2

第一個數字"1"該選項被"dump"命令使用來檢查一個文件系統應該以多快頻率進行轉儲,若不須要轉儲就設置該字段爲0
第二個數字"2"該字段被fsck命令用來決定在啓動時須要被掃描的文件系統的順序,根文件系統"/"對應該字段的值應該爲1,其餘文件系統應該爲2。若該文件系統無需在啓動時掃描則設置該字段爲0
當以 noatime 選項加載(mount)文件系統時,對文件的讀取不會更新文件屬性中的atime信息。設置noatime的重要性是消除了文件系統對文件的寫操做,文件只是簡單地被系統讀取。因爲寫操做相對讀來講要更消耗系統資源,因此這樣設置能夠明顯提升服務器的性能.wtime信息仍然有效,任什麼時候候文件被寫,該信息仍被更新。

mount -a # 自動加載 fstab 文件掛載,避免配置錯誤,系統沒法重啓

}

大磁盤2T和16T分區{

parted /dev/sdb # 針對磁盤分區
(parted) mklabel gpt # 設置爲 gpt
(parted) print
(parted) mkpart primary 0KB 22.0TB # 指定分區大小
Is this still acceptable to you?
Yes/No? Yes
Ignore/Cancel? Ignore
(parted) print
Model: LSI MR9271-8i (scsi)
Disk /dev/sdb: 22.0TB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Number Start End Size File system Name Flags
1 17.4kB 22.0TB 22.0TB primary
(parted) quit

mkfs.ext4 /dev/sdb1 # e2fsprogs升級後支持大於16T硬盤

# 大於16T的單個分區ext4格式化報錯,須要升級e2fsprogs
Size of device /dev/sdb1 too big to be expressed in 32 bits using a blocksize of 4096.

yum -y install xfsprogs
mkfs.xfs -f /dev/sdb1 # 大於16T單個分區也可使用XFS分區,但inode佔用很大,對大量的小文件支持不太好

}

raid原理與區別{

raid0至少2塊硬盤.吞吐量大,性能好,同時讀寫,但損壞一個就完蛋
raid1至少2塊硬盤.至關鏡像,一個存儲,一個備份.安全性比較高.可是性能比0弱
raid5至少3塊硬盤.分別存儲校驗信息和數據,壞了一個根據校驗信息能恢復
raid6至少4塊硬盤.兩個獨立的奇偶系統,可壞兩塊磁盤,寫性能很是差

}

用戶{

users # 顯示全部的登陸用戶
groups # 列出當前用戶和他所屬的組
who -q # 顯示全部的登陸用戶
groupadd # 添加組
useradd user # 創建用戶
passwd username # 修改密碼
userdel -r # 刪除賬號及家目錄
chown -R user:group # 修改目錄擁有者(R遞歸)
chown y\.li:mysql # 修改全部者用戶中包含點"."
umask # 設置用戶文件和目錄的文件建立缺省屏蔽值
chgrp # 修改用戶組
finger # 查找用戶顯示信息
echo "xuesong" | passwd user --stdin # 非交互修改密碼
useradd -g www -M -s /sbin/nologin www # 指定組並不容許登陸的用戶,nologin容許使用服務
useradd -g www -M -s /bin/false www # 指定組並不容許登陸的用戶,false最爲嚴格
useradd -d /data/song -g song song # 建立用戶並指定家目錄和組
usermod -l newuser olduser # 修改用戶名
usermod -g user group # 修改用戶所屬組
usermod -d dir -m user # 修改用戶家目錄
usermod -G group user # 將用戶添加到附加組
gpasswd -d user group # 從組中刪除用戶
su - user -c " #cmd1; " # 切換用戶執行

}

腳本{

#!/bin/sh # 在腳本第一行腳本頭 # sh爲當前系統默認shell,可指定爲bash等shell
shopt # 顯示和設置shell中的行爲選項
sh -x # 執行過程
sh -n # 檢查語法
(a=bbk) # 括號建立子shell運行
basename /a/b/c # 從全路徑中保留最後一層文件名或目錄
dirname # 取路徑
$RANDOM # 隨機數
$$ # 進程號
source FileName # 在當前bash環境下讀取並執行FileName中的命令 # 等同 . FileName
sleep 5 # 間隔睡眠5秒
trap # 在接收到信號後將要採起的行動
trap "" 2 3 # 禁止ctrl+c
$PWD # 當前目錄
$HOME # 家目錄
$OLDPWD # 以前一個目錄的路徑
cd - # 返回上一個目錄路徑
local ret # 局部變量
yes # 重複打印
yes |rm -i * # 自動回答y或者其餘
ls -p /home # 區分目錄和文件夾
ls -d /home/ # 查看匹配完整路徑
time a.sh # 測試程序執行時間
echo -n aa;echo bb # 不換行執行下一句話 將字符串原樣輸出
echo -e "s\tss\n\n\n" # 使轉義生效
echo $a | cut -c2-6 # 取字符串中字元
echo {a,b,c}{a,b,c}{a,b,c} # 排列組合(括號內一個元素分別和其餘括號內元素組合)
echo $((2#11010)) # 二進制轉10進制
echo aaa | tee file # 打印同時寫入文件 默認覆蓋 -a追加
echo {1..10} # 打印10個字符
printf '%10s\n'|tr " " a # 打印10個字符
pwd | awk -F/ '{ print $2 }' # 返回目錄名
tac file |sed 1,3d|tac # 倒置讀取文件 # 刪除最後3行
tail -3 file # 取最後3行
outtmp=/tmp/$$`date +%s%N`.outtmp # 臨時文件定義
:(){ :|:& };: # fork炸彈,系統執行海量的進程,直到系統僵死
echo -e "\e[32mcolour\e[0m" # 打印顏色
echo -e "\033[32mcolour\033[m" # 打印顏色
echo -e "\033[0;31mL\033[0;32mO\033[0;33mV\033[0;34mE\t\033[0;35mY\033[0;36mO\033[0;32mU\e[m" # 打印顏色

正則表達式{

^ # 行首定位
$ # 行尾定位
. # 匹配除換行符之外的任意字符
* # 匹配0或多個重複字符
+ # 重複一次或更屢次
? # 重複零次或一次
? # 結束貪婪因子 .*? 表示最小匹配
[] # 匹配一組中任意一個字符
[^] # 匹配不在指定組內的字符
\ # 用來轉義元字符
< # 詞首定位符(支持vi和grep) <love
> # 詞尾定位符(支持vi和grep) love>
x\{m\} # 重複出現m次
x\{m,\} # 重複出現至少m次
x\{m,n\} # 重複出現至少m次不超過n次
X? # 匹配出現零次或一次的大寫字母 X
X+ # 匹配一個或多個字母 X
() # 括號內的字符爲一組
(ab|de)+ # 匹配一連串的(最少一個) abc 或 def;abc 和 def 將匹配
[[:alpha:]] # 表明全部字母不論大小寫
[[:lower:]] # 表示小寫字母
[[:upper:]] # 表示大寫字母
[[:digit:]] # 表示數字字符
[[:digit:][:lower:]] # 表示數字字符加小寫字母

元字符{

\d # 匹配任意一位數字
\D # 匹配任意單個非數字字符
\w # 匹配任意單個字母數字下劃線字符,同義詞是 [:alnum:]
\W # 匹配非數字型的字符

}

字符類:空白字符{

\s # 匹配任意的空白符
\S # 匹配非空白字符
\b # 匹配單詞的開始或結束
\n # 匹配換行符
\r # 匹配回車符
\t # 匹配製表符
\b # 匹配退格符
\0 # 匹配空值字符

}

字符類:錨定字符{

\b # 匹配字邊界(不在[]中時)
\B # 匹配非字邊界
\A # 匹配字符串開頭
\Z # 匹配字符串或行的末尾
\z # 只匹配字符串末尾
\G # 匹配前一次m//g離開之處

}

捕獲{

(exp) # 匹配exp,並捕獲文本到自動命名的組裏
(?<name>exp) # 匹配exp,並捕獲文本到名稱爲name的組裏,也能夠寫成(?'name'exp)
(?:exp) # 匹配exp,不捕獲匹配的文本,也不給此分組分配組號

}

零寬斷言{

(?=exp) # 匹配exp前面的位置
(?<=exp) # 匹配exp後面的位置
(?!exp) # 匹配後面跟的不是exp的位置
(?<!exp) # 匹配前面不是exp的位置
(?#comment) # 註釋不對正則表達式的處理產生任何影響,用於註釋

}

特殊字符{

http://en.wikipedia.org/wiki/Ascii_table
^H \010 \b
^M \015 \r
匹配特殊字符: ctrl+V ctrl不放在按H或M 便可輸出^H,用於匹配

}

}

流程結構{

if判斷{

if [ $a == $b ]
then
echo "等於"
else
echo "不等於"
fi

}

case分支選擇{

case $xs in
0) echo "0" ;;
1) echo "1" ;;
*) echo "其餘" ;;
esac

}

while循環{

# while true 等同 while :
# 讀文件爲整行讀入
num=1
while [ $num -lt 10 ]
do
echo $num
((num=$num+2))
done
###########################
grep a a.txt | while read a
do
echo $a
done
###########################
while read a
do
echo $a
done < a.txt

}

for循環{

# 讀文件已空格分隔
w=`awk -F ":" '{print $1}' c`
for d in $w
do
$d
done
###########################
for ((i=0;i<${#o[*]};i++))
do
echo ${o[$i]}
done

}

until循環{

# 當command不爲0時循環
until command
do
body
done

}

流程控制{

break N # 跳出幾層循環
continue N # 跳出幾層循環,循環次數不變
continue # 從新循環次數不變

}

}

變量{

A="a b c def" # 將字符串複製給變量
A=`cmd` # 將命令結果賦給變量
A=$(cmd) # 將命令結果賦給變量
eval a=\$$a # 間接調用
i=2&&echo $((i+3)) # 計算後打印新變量結果
i=2&&echo $[i+3] # 計算後打印新變量結果
a=$((2>6?5:8)) # 判斷兩個值知足條件的賦值給變量
$1 $2 $* # 位置參數 *表明全部
env # 查看環境變量
env | grep "name" # 查看定義的環境變量
set # 查看環境變量和本地變量
read name # 輸入變量
readonly name # 把name這個變量設置爲只讀變量,不容許再次設置
readonly # 查看系統存在的只讀文件
export name # 變量name由本地升爲環境
export name="RedHat" # 直接定義name爲環境變量
export Stat$nu=2222 # 變量引用變量賦值
unset name # 變量清除
export -n name # 去掉只讀變量
shift # 用於移動位置變量,調整位置變量,使$3的值賦給$2.$2的值賦予$1
name + 0 # 將字符串轉換爲數字
number " " # 將數字轉換成字符串
a='ee';b='a';echo ${!b} # 間接引用name變量的值
: ${a="cc"} # 若是a有值則不改變,若是a無值則賦值a變量爲cc

數組{

A=(a b c def) # 將變量定義爲數組
${#A[*]} # 數組個數
${A[*]} # 數組全部元素,大字符串
${A[@]} # 數組全部元素,相似列表可迭代
${A[2]} # 腳本的一個參數或數組第三位

}

定義變量類型{

declare 或 typeset
-r 只讀(readonly同樣)
-i 整形
-a 數組
-f 函數
-x export
declare -i n=0

}

系統變量{

$0 # 腳本啓動名(包括路徑)
$n # 第n個參數,n=1,2,…9
$* # 全部參數列表(不包括腳本自己)
$@ # 全部參數列表(獨立字符串)
$# # 參數個數(不包括腳本自己)
$$ # 當前程式的PID
$! # 執行上一個指令的PID
$? # 執行上一個指令的返回值

}

變量引用技巧{

${name:+value} # 若是設置了name,就把value顯示,未設置則爲空
${name:-value} # 若是設置了name,就顯示它,未設置就顯示value
${name:?value} # 未設置提示用戶錯誤信息value 
${name:=value} # 如未設置就把value設置並顯示<寫入本地中>
${#A} # 可獲得變量中字節
${A:4:9} # 取變量中第4位到後面9位
${A:(-1)} # 倒敘取最後一個字符
${A/www/http} # 取變量而且替換每行第一個關鍵字
${A//www/http} # 取變量而且所有替換每行關鍵字

定義了一個變量: file=/dir1/dir2/dir3/my.file.txt
${file#*/} # 去掉第一條 / 及其左邊的字串:dir1/dir2/dir3/my.file.txt
${file##*/} # 去掉最後一條 / 及其左邊的字串:my.file.txt
${file#*.} # 去掉第一個 . 及其左邊的字串:file.txt
${file##*.} # 去掉最後一個 . 及其左邊的字串:txt
${file%/*} # 去掉最後條 / 及其右邊的字串:/dir1/dir2/dir3
${file%%/*} # 去掉第一條 / 及其右邊的字串:(空值)
${file%.*} # 去掉最後一個 . 及其右邊的字串:/dir1/dir2/dir3/my.file
${file%%.*} # 去掉第一個 . 及其右邊的字串:/dir1/dir2/dir3/my
# # 是去掉左邊(在鍵盤上 # 在 $ 之左邊)
# % 是去掉右邊(在鍵盤上 % 在 $ 之右邊)
# 單一符號是最小匹配﹔兩個符號是最大匹配

}

}

test條件判斷{

# 符號 [ ] 等同 test命令

expression爲字符串操做{

-n str # 字符串str是否不爲空
-z str # 字符串str是否爲空

}

expression爲文件操做{

-a # 而且,兩條件爲真
-b # 是否塊文件
-p # 文件是否爲一個命名管道
-c # 是否字符文件
-r # 文件是否可讀
-d # 是否一個目錄
-s # 文件的長度是否不爲零
-e # 文件是否存在
-S # 是否爲套接字文件
-f # 是否普通文件
-x # 文件是否可執行,則爲真
-g # 是否設置了文件的 SGID 位
-u # 是否設置了文件的 SUID 位
-G # 文件是否存在且歸該組全部
-w # 文件是否可寫,則爲真
-k # 文件是否設置了的粘貼位
-t fd # fd 是不是個和終端相連的打開的文件描述符(fd 默認爲 1)
-o # 或,一個條件爲真
-O # 文件是否存在且歸該用戶全部
! # 取反

}

expression爲整數操做{

expr1 -a expr2 # 若是 expr1 和 expr2 評估爲真,則爲真
expr1 -o expr2 # 若是 expr1 或 expr2 評估爲真,則爲真

}

兩值比較{

整數 字符串
-lt < # 小於
-gt > # 大於
-le <= # 小於或等於
-ge >= # 大於或等於
-eq == # 等於
-ne != # 不等於

}

test 10 -lt 5 # 判斷大小
echo $? # 查看上句test命令返回狀態 # 結果0爲真,1爲假
test -n "hello" # 判斷字符串長度是否爲0
[ $? -eq 0 ] && echo "success" || exit   # 判斷成功提示,失敗則退出

}

重定向{

# 標準輸出 stdout 和 標準錯誤 stderr 標準輸入stdin
cmd 1> fiel # 把 標準輸出 重定向到 file 文件中
cmd > file 2>&1 # 把 標準輸出 和 標準錯誤 一塊兒重定向到 file 文件中
cmd 2> file # 把 標準錯誤 重定向到 file 文件中
cmd 2>> file # 把 標準錯誤 重定向到 file 文件中(追加)
cmd >> file 2>&1 # 把 標準輸出 和 標準錯誤 一塊兒重定向到 file 文件中(追加)
cmd < file >file2 # cmd 命令以 file 文件做爲 stdin(標準輸入),以 file2 文件做爲 標準輸出
cat <>file # 以讀寫的方式打開 file
cmd < file cmd # 命令以 file 文件做爲 stdin
cmd << delimiter
cmd; #從 stdin 中讀入,直至遇到 delimiter 分界符
delimiter

>&n # 使用系統調用 dup (2) 複製文件描述符 n 並把結果用做標準輸出
<&n # 標準輸入複製自文件描述符 n
<&- # 關閉標準輸入(鍵盤)
>&- # 關閉標準輸出
n<&- # 表示將 n 號輸入關閉
n>&- # 表示將 n 號輸出關閉

}

運算符{

$[]等同於$(()) # $[]表示形式告訴shell求中括號中的表達式的值
~var # 按位取反運算符,把var中全部的二進制爲1的變爲0,爲0的變爲1
var\<<str # 左移運算符,把var中的二進制位向左移動str位,忽略最左端移出的各位,最右端的各位上補上0值,每作一次按位左移就有var乘2
var>>str # 右移運算符,把var中全部的二進制位向右移動str位,忽略最右移出的各位,最左的各位上補0,每次作一次右移就有實現var除以2
var&str # 與比較運算符,var和str對應位,對於每一個二進制來講,若是二都爲1,結果爲1.不然爲0
var^str # 異或運算符,比較var和str對應位,對於二進制來講若是兩者互補,結果爲1,不然爲0
var|str # 或運算符,比較var和str的對應位,對於每一個二進制來講,如二都該位有一個1或都是1,結果爲1,不然爲0

運算符優先級{
級別 運算符 說明
1 =,+=,-=,/=,%=,*=,&=,^=,|=,<<=,>>= # 賦值運算符
2 || # 邏輯或 前面不成功執行
3 && # 邏輯與 前面成功後執行
4 | # 按位或
5 ^ # 按位異或
6 & # 按位與
7 ==,!= # 等於/不等於
8 <=,>=,<,> # 小於或等於/大於或等於/小於/大於
9 \<<,>> # 按位左移/按位右移 (無轉意符號)
10 +,- # 加減
11 *,/,% # 乘,除,取餘
12 ! ,~ # 邏輯非,按位取反或補碼
13 -,+ # 正負
}
}
數學運算{
$(( )) # 整數運算
+ - * / ** # 分別爲 "加、減、乘、除、密運算"
& | ^ ! # 分別爲 "AND、OR、XOR、NOT" 運算
% # 餘數運算
let{
let # 運算
let x=16/4
let x=5**5
}
expr{
expr 14 % 9 # 整數運算
SUM=`expr 2 \* 3` # 乘後結果賦值給變量
LOOP=`expr $LOOP + 1` # 增量計數(加循環便可) LOOP=0
expr length "bkeep zbb" # 計算字串長度
expr substr "bkeep zbb" 4 9 # 抓取字串
expr index "bkeep zbb" e # 抓取第一個字符數字串出現的位置
expr 30 / 3 / 2 # 運算符號有空格
expr bkeep.doc : '.*' # 模式匹配(可使用expr經過指定冒號選項計算字符串中字符數)
expr bkeep.doc : '\(.*\).doc' # 在expr中可使用字符串匹配操做,這裏使用模式抽取.doc文件附屬名
數值測試{
#若是試圖計算非整數,則會返回錯誤
rr=3.4
expr $rr + 1
expr: non-numeric argument
rr=5
expr $rr + 1
6
}
}
bc{
echo "m^n"|bc # 次方計算
seq -s '+' 1000 |bc # 從1加到1000
seq 1 1000 |tr "\n" "+"|sed 's/+$/\n/'|bc # 從1加到1000
}
}

grep{
-c # 顯示匹配到得行的數目,不顯示內容
-h # 不顯示文件名
-i # 忽略大小寫
-l # 只列出匹配行所在文件的文件名
-n # 在每一行中加上相對行號
-s # 無聲操做只顯示報錯,檢查退出狀態
-v # 反向查找
-e # 使用正則表達式
-w # 精確匹配
-wc # 精確匹配次數
-o # 查詢全部匹配字段
-P # 使用perl正則表達式
-A3 # 打印匹配行和下三行
-B3 # 打印匹配行和上三行
-C3 # 打印匹配行和上下三行
grep -v "a" txt # 過濾關鍵字符行
grep -w 'a\>' txt # 精確匹配字符串
grep -i "a" txt # 大小寫敏感
grep "a[bB]" txt # 同時匹配大小寫
grep '[0-9]\{3\}' txt # 查找0-9重複三次的所在行
grep -E "word1|word2|word3" file # 任意條件匹配
grep word1 file | grep word2 |grep word3 # 同時匹配三個
echo quan@163.com |grep -Po '(?<=@.).*(?=.$)' # 零寬斷言截取字符串 # 63.co
echo "I'm singing while you're dancing" |grep -Po '\b\w+(?=ing\b)' # 零寬斷言匹配
echo 'Rx Optical Power: -5.01dBm, Tx Optical Power: -2.41dBm' |grep -Po '(?<=:).*?(?=d)' # 取出d前面數字 # ?爲最小匹配
echo 'Rx Optical Power: -5.01dBm, Tx Optical Power: -2.41dBm' | grep -Po '[-0-9.]+' # 取出d前面數字 # ?爲最小匹配
echo '["mem",ok],["hardware",false],["filesystem",false]' |grep -Po '[^"]+(?=",false)' # 取出false前面的字母
echo '["mem",ok],["hardware",false],["filesystem",false]' |grep -Po '\w+",false'|grep -Po '^\w+' # 取出false前面的字母
grep用於if判斷{
if echo abc | grep "a" > /dev/null 2>&1
then
echo "abc"
else
echo "null"
fi
}
}

trap{
信號 說明
HUP(1) # 掛起,一般因終端掉線或用戶退出而引起
INT(2) # 中斷,一般因按下Ctrl+C組合鍵而引起
QUIT(3) # 退出,一般因按下Ctrl+\組合鍵而引起
ABRT(6) # 停止,一般因某些嚴重的執行錯誤而引起
ALRM(14) # 報警,一般用來處理超時
TERM(15) # 終止,一般在系統關機時發送
trap捕捉到信號以後,能夠有三種反應方式:
一、執行一段程序來處理這一信號
二、接受信號的默認操做
三、忽視這一信號
第一種形式的trap命令在shell接收到 signal list 清單中數值相同的信號時,將執行雙引號中的命令串:
trap 'commands' signal-list # 單引號,要在shell探測到信號來的時候才執行命令和變量的替換,時間一直變
trap "commands" signal-list # 雙引號,shell第一次設置信號的時候就執行命令和變量的替換,時間不變
}

awk{
# 默認是執行打印所有 print $0
# 1爲真 打印$0
# 0爲假 不打印
-F # 改變FS值(分隔符)
~ # 域匹配
== # 變量匹配
!~ # 匹配不包含
= # 賦值
!= # 不等於
+= # 疊加
\b # 退格
\f # 換頁
\n # 換行
\r # 回車
\t # 製表符Tab
\c # 表明任一其餘字符
-F"[ ]+|[%]+" # 多個空格或多個%爲分隔符
[a-z]+ # 多個小寫字母
[a-Z] # 表明全部大小寫字母(aAbB...zZ)
[a-z] # 表明全部大小寫字母(ab...z)
[:alnum:] # 字母數字字符
[:alpha:] # 字母字符
[:cntrl:] # 控制字符
[:digit:] # 數字字符
[:graph:] # 非空白字符(非空格、控制字符等)
[:lower:] # 小寫字母
[:print:] # 與[:graph:]類似,可是包含空格字符
[:punct:] # 標點字符
[:space:] # 全部的空白字符(換行符、空格、製表符)
[:upper:] # 大寫字母
[:xdigit:] # 十六進制的數字(0-9a-fA-F)
[[:digit:][:lower:]] # 數字和小寫字母(佔一個字符)
內建變量{
$n # 當前記錄的第 n 個字段,字段間由 FS 分隔
$0 # 完整的輸入記錄
ARGC # 命令行參數的數目
ARGIND # 命令行中當前文件的位置 ( 從 0 開始算 )
ARGV # 包含命令行參數的數組
CONVFMT # 數字轉換格式 ( 默認值爲 %.6g)
ENVIRON # 環境變量關聯數組
ERRNO # 最後一個系統錯誤的描述
FIELDWIDTHS # 字段寬度列表 ( 用空格鍵分隔 )
FILENAME # 當前文件名
FNR # 同 NR ,但相對於當前文件
FS # 字段分隔符 ( 默認是任何空格 )
IGNORECASE # 若是爲真(即非 0 值),則進行忽略大小寫的匹配
NF # 當前記錄中的字段數(列)
NR # 當前行數
OFMT # 數字的輸出格式 ( 默認值是 %.6g)
OFS # 輸出字段分隔符 ( 默認值是一個空格 )
ORS # 輸出記錄分隔符 ( 默認值是一個換行符 )
RLENGTH # 由 match 函數所匹配的字符串的長度
RS # 記錄分隔符 ( 默認是一個換行符 )
RSTART # 由 match 函數所匹配的字符串的第一個位置
SUBSEP # 數組下標分隔符 ( 默認值是 /034)
BEGIN # 先處理(可不加文件參數)
END # 結束時處理
}
內置函數{
gsub(r,s) # 在整個$0中用s替代r 至關於 sed 's///g'
gsub(r,s,t) # 在整個t中用s替代r
index(s,t) # 返回s中字符串t的第一位置
length(s) # 返回s長度
match(s,r) # 測試s是否包含匹配r的字符串
split(s,a,fs) # 在fs上將s分紅序列a
sprint(fmt,exp) # 返回經fmt格式化後的exp
sub(r,s) # 用$0中最左邊最長的子串代替s 至關於 sed 's///'
substr(s,p) # 返回字符串s中從p開始的後綴部分
substr(s,p,n) # 返回字符串s中從p開始長度爲n的後綴部分
}
awk判斷{
awk '{print ($1>$2)?"第一排"$1:"第二排"$2}' # 條件判斷 括號表明if語句判斷 "?"表明then ":"表明else
awk '{max=($1>$2)? $1 : $2; print max}' # 條件判斷 若是$1大於$2,max值爲爲$1,不然爲$2
awk '{if ( $6 > 50) print $1 " Too high" ;\
else print "Range is OK"}' file
awk '{if ( $6 > 50) { count++;print $3 } \
else { x+5; print $2 } }' file
}
awk循環{
awk '{i = 1; while ( i <= NF ) { print NF, $i ; i++ } }' file
awk '{ for ( i = 1; i <= NF; i++ ) print NF,$i }' file
}
awk '/Tom/' file # 打印匹配到得行
awk '/^Tom/{print $1}' # 匹配Tom開頭的行 打印第一個字段
awk '$1 !~ /ly$/' # 顯示全部第一個字段不是以ly結尾的行
awk '$3 <40' # 若是第三個字段值小於40纔打印
awk '$4==90{print $5}' # 取出第四列等於90的第五列
awk '/^(no|so)/' test # 打印全部以模式no或so開頭的行
awk '$3 * $4 > 500' # 算術運算(第三個字段和第四個字段乘積大於500則顯示)
awk '{print NR" "$0}' # 加行號
awk '/tom/,/suz/' # 打印tom到suz之間的行
awk '{a+=$1}END{print a}' # 列求和
awk 'sum+=$1{print sum}' # 將$1的值疊加後賦給sum
awk '{a+=$1}END{print a/NR}' # 列求平均值
awk '!s[$1 $3]++' file # 根據第一列和第三列過濾重複行
awk -F'[ :\t]' '{print $1,$2}' # 以空格、:、製表符Tab爲分隔符
awk '{print "'"$a"'","'"$b"'"}' # 引用外部變量
awk '{if(NR==52){print;exit}}' # 顯示第52行
awk '/關鍵字/{a=NR+2}a==NR {print}' # 取關鍵字下第幾行
awk 'gsub(/liu/,"aaaa",$1){print $0}' # 只打印匹配替換後的行
ll | awk -F'[ ]+|[ ][ ]+' '/^$/{print $8}' # 提取時間,空格不固定
awk '{$1="";$2="";$3="";print}' # 去掉前三列
echo aada:aba|awk '/d/||/b/{print}' # 匹配兩內容之一
echo aada:abaa|awk -F: '$1~/d/||$2~/b/{print}' # 關鍵列匹配兩內容之一
echo Ma asdas|awk '$1~/^[a-Z][a-Z]$/{print }' # 第一個域匹配正則
echo aada:aaba|awk '/d/&&/b/{print}' # 同時匹配兩條件
awk 'length($1)=="4"{print $1}' # 字符串位數
awk '{if($2>3){system ("touch "$1)}}' # 執行系統命令
awk '{sub(/Mac/,"Macintosh",$0);print}' # 用Macintosh替換Mac
awk '{gsub(/Mac/,"MacIntosh",$1); print}' # 第一個域內用Macintosh替換Mac
awk -F '' '{ for(i=1;i<NF+1;i++)a+=$i ;print a}' # 多位數算出其每位數的總和.好比 1234, 獲得 10
awk '{ i=$1%10;if ( i == 0 ) {print i}}' # 判斷$1是否整除(awk中定義變量引用時不能帶 $ )
awk 'BEGIN{a=0}{if ($1>a) a=$1 fi}END{print a}' # 列求最大值 設定一個變量開始爲0,遇到比該數大的值,就賦值給該變量,直到結束
awk 'BEGIN{a=11111}{if ($1<a) a=$1 fi}END{print a}' # 求最小值
awk '{if(A)print;A=0}/regexp/{A=1}' # 查找字符串並將匹配行的下一行顯示出來,但並不顯示匹配行
awk '/regexp/{print A}{A=$0}' # 查找字符串並將匹配行的上一行顯示出來,但並不顯示匹配行
awk '{if(!/mysql/)gsub(/1/,"a");print $0}' # 將1替換成a,而且只在行中未出現字串mysql的狀況下替換
awk 'BEGIN{srand();fr=int(100*rand());print fr;}' # 獲取隨機數
awk '{if(NR==3)F=1}{if(F){i++;if(i%7==1)print}}' # 從第3行開始,每7行顯示一次
awk '{if(NF<1){print i;i=0} else {i++;print $0}}' # 顯示空行分割各段的行數
echo +null:null |awk -F: '$1!~"^+"&&$2!="null"{print $0}' # 關鍵列同時匹配
awk -v RS=@ 'NF{for(i=1;i<=NF;i++)if($i) printf $i;print ""}' # 指定記錄分隔符
awk '{b[$1]=b[$1]$2}END{for(i in b){print i,b[i]}}' # 列疊加
awk '{ i=($1%100);if ( $i >= 0 ) {print $0,$i}}' # 求餘數
awk '{b=a;a=$1; if(NR>1){print a-b}}' # 當前行減上一行
awk '{a[NR]=$1}END{for (i=1;i<=NR;i++){print a[i]-a[i-1]}}' # 當前行減上一行
awk -F: '{name[x++]=$1};END{for(i=0;i<NR;i++)print i,name[i]}' # END只打印最後的結果,END塊裏面處理數組內容
awk '{sum2+=$2;count=count+1}END{print sum2,sum2/count}' # $2的總和 $2總和除個數(平均值)
awk -v a=0 -F 'B' '{for (i=1;i<NF;i++){ a=a+length($i)+1;print a }}' # 打印因此B的所在位置
awk 'BEGIN{ "date" | getline d; split(d,mon) ; print mon[2]}' file # 將date值賦給d,並將d設置爲數組mon,打印mon數組中第2個元素
awk 'BEGIN{info="this is a test2010test!";print substr(info,4,10);}' # 截取字符串(substr使用)
awk 'BEGIN{info="this is a test2010test!";print index(info,"test")?"ok":"no found";}' # 匹配字符串(index使用)
awk 'BEGIN{info="this is a test2010test!";print match(info,/[0-9]+/)?"ok":"no found";}' # 正則表達式匹配查找(match使用)
awk '{for(i=1;i<=4;i++)printf $i""FS; for(y=10;y<=13;y++) printf $y""FS;print ""}' # 打印前4列和後4列
awk 'BEGIN{for(n=0;n++<9;){for(i=0;i++<n;)printf i"x"n"="i*n" ";print ""}}' # 乘法口訣
awk 'BEGIN{info="this is a test";split(info,tA," ");print length(tA);for(k in tA){print k,tA[k];}}' # 字符串分割(split使用)
awk '{if (system ("grep "$2" tmp/* > /dev/null 2>&1") == 0 ) {print $1,"Y"} else {print $1,"N"} }' a # 執行系統命令判斷返回狀態
awk '{for(i=1;i<=NF;i++) a[i,NR]=$i}END{for(i=1;i<=NF;i++) {for(j=1;j<=NR;j++) printf a[i,j] " ";print ""}}' # 將多行轉多列
netstat -an|awk -v A=$IP -v B=$PORT 'BEGIN{print "Clients\tGuest_ip"}$4~A":"B{split($5,ip,":");a[ip[1]]++}END{for(i in a)print a[i]"\t"i|"sort -nr"}' # 統計IP鏈接個數
cat 1.txt|awk -F" # " '{print "insert into user (user,password,email)values(""'\''"$1"'\'\,'""'\''"$2"'\'\,'""'\''"$3"'\'\)\;'"}' >>insert_1.txt # 處理sql語句
awk 'BEGIN{printf "what is your name?";getline name < "/dev/tty" } $1 ~name {print "FOUND" name " on line ", NR "."} END{print "see you," name "."}' file # 兩文件匹配
取本機IP{
/sbin/ifconfig |awk -v RS="Bcast:" '{print $NF}'|awk -F: '/addr/{print $2}'
/sbin/ifconfig |awk '/inet/&&$2!~"127.0.0.1"{split($2,a,":");print a[2]}'
/sbin/ifconfig |awk -v RS='inet addr:' '$1!="eth0"&&$1!="127.0.0.1"{print $1}'|awk '{printf"%s|",$0}'
/sbin/ifconfig |awk '{printf("line %d,%s\n",NR,$0)}' # 指定類型(%d數字,%s字符)
}
查看磁盤空間{
df -h|awk -F"[ ]+|%" '$5>14{print $5}'
df -h|awk 'NR!=1{if ( NF == 6 ) {print $5} else if ( NF == 5) {print $4} }'
df -h|awk 'NR!=1 && /%/{sub(/%/,"");print $(NF-1)}'
df -h|sed '1d;/ /!N;s/\n//;s/ \+/ /;' #將磁盤分區整理成一行 可直接用 df -P
}
排列打印{
awk 'END{printf "%-10s%-10s\n%-10s%-10s\n%-10s%-10s\n","server","name","123","12345","234","1234"}' txt
awk 'BEGIN{printf "|%-10s|%-10s|\n|%-10s|%-10s|\n|%-10s|%-10s|\n","server","name","123","12345","234","1234"}'
awk 'BEGIN{
print " *** 開 始 *** ";
print "+-----------------+";
printf "|%-5s|%-5s|%-5s|\n","id","name","ip";
}
$1!=1 && NF==4{printf "|%-5s|%-5s|%-5s|\n",$1,$2,$3" "$11}
END{
print "+-----------------+";
print " *** 結 束 *** "
}' txt
}
awk經典題{
分析圖片服務日誌,把日誌(每一個圖片訪問次數*圖片大小的總和)排行,也就是計算每一個url的總訪問大小
說明:本題生產環境應用:這個功能能夠用於IDC網站流量帶寬很高,而後經過分析服務器日誌哪些元素佔用流量過大,進而進行優化或裁剪該圖片,壓縮js等措施。
本題須要輸出三個指標: 【被訪問次數】 【訪問次數*單個被訪問文件大小】 【文件名(帶URL)】
測試數據
59.33.26.105 - - [08/Dec/2010:15:43:56 +0800] "GET /static/images/photos/2.jpg HTTP/1.1" 200 11299
awk '{array_num[$7]++;array_size[$7]+=$10}END{for(i in array_num) {print array_num[i]" "array_size[i]" "i}}'
}
awk練習題{
wang 4
cui 3
zhao 4
liu 3
liu 3
chang 5
li 2
1 經過第一個域找出字符長度爲4的
2 當第二列值大於3時,建立空白文件,文件名爲當前行第一個域$1 (touch $1)
3 將文檔中 liu 字符串替換爲 hong
4 求第二列的和
5 求第二列的平均值
6 求第二列中的最大值
7 將第一列過濾重複後,列出每一項,每一項的出現次數,每一項的大小總和
一、字符串長度
awk 'length($1)=="4"{print $1}'
二、執行系統命令
awk '{if($2>3){system ("touch "$1)}}'
三、gsub(/r/,"s",域) 在指定域(默認$0)中用s替代r (sed 's///g')
awk '{gsub(/liu/,"hong",$1);print $0}' a.txt
四、列求和
awk '{a+=$2}END{print a}'
五、列求平均值
awk '{a+=$2}END{print a/NR}'
awk '{a+=$2;b++}END{print a,a/b}'
六、列求最大值
awk 'BEGIN{a=0}{if($2>a) a=$2 }END{print a}'
七、將第一列過濾重複列出每一項,每一項的出現次數,每一項的大小總和
awk '{a[$1]++;b[$1]+=$2}END{for(i in a){print i,a[i],b[i]}}'
}
awk處理複雜日誌{
6.19:
DHB_014_號百總機服務業務日報:廣州 到達數異常!
DHB_023_號百漏話提醒日報:珠海 到達數異常!
6.20:
DHB_014_號百總機服務業務日報:廣州 到達數異常!到
awk -F '[_ :]+' 'NF>2{print $4,$1"_"$2,b |"sort";next}{b=$1}'
# 當前行NF小於等於2 只針對{print $4,$1"_"$2,b |"sort";next} 有效 即 6.19:行跳過此操做, {b=$1} 仍然執行
# 當前行NF大於2 執行到 next 強制跳過本行,即跳事後面的 {b=$1}
廣州 DHB_014 6.19
}
}


sed{
# 先讀取資料、存入模式空間、對其進行編輯、再輸出、再用下一行替換模式空間內容
# 調試工具sedsed (參數 -d) http://aurelio.net/sedsed/sedsed-1.0
-n # 輸出由編輯指令控制(取消默認的輸出,必須與編輯指令一塊兒配合)
-i # 直接對文件操做
-e # 多重編輯
-r # 正則可不轉移特殊字符
b # 跳過匹配的行
p # 打印
d # 刪除
s # 替換
g # 配合s所有替換
i # 行前插入
a # 行後插入
r # 讀
y # 轉換
q # 退出
& # 表明查找的串內容
* # 任意多個 前驅字符(前導符)
? # 0或1個 最小匹配 沒加-r參數需轉義 \?
$ # 最後一行
.* # 匹配任意多個字符
\(a\) # 保存a做爲標籤1(\1)
模式空間{
# 模式空間(兩行兩行處理) 模式匹配的範圍,通常而言,模式空間是輸入文本中某一行,可是能夠經過使用N函數把多於一行讀入模式空間
# 暫存空間裏默認存儲一個空行
n # 讀入下一行(覆蓋上一行)
h # 把模式空間裏的行拷貝到暫存空間
H # 把模式空間裏的行追加到暫存空間
g # 用暫存空間的內容替換模式空間的行
G # 把暫存空間的內容追加到模式空間的行後
x # 將暫存空間的內容於模式空間裏的當前行互換
! # 對其前面的要匹配的範圍取反
D # 刪除當前模式空間中直到幷包含第一個換行符的全部字符(/.*/匹配模式空間中全部內容,匹配到就執行D,沒匹配到就結束D)
N # 追加下一個輸入行到模式空間後面並在第兩者間嵌入一個換行符,改變當前行號碼,模式匹配能夠延伸跨域這個內嵌換行
p # 打印模式空間中的直到幷包含第一個換行的全部字符
}
標籤函數{
: lable # 創建命令標記,配合b,t函數使用跳轉
b lable # 分支到腳本中帶有標記的地方,若是分支不存在則分支到腳本的末尾。
t labe # 判斷分支,從最後一行開始,條件一旦知足或者T,t命令,將致使分支到帶有標號的命令出,或者到腳本末尾。與b函數不一樣在於t在執行跳轉前會先檢查其前一個替換命令是否成功,如成功,則執行跳轉。
sed -e '{:p1;/A/s/A/AA/;/B/s/B/BB/;/[AB]\{10\}/b;b p1;}' # 文件內容第一行A第二行B:創建標籤p1;兩個替換函數(A替換成AA,B替換成BB)當A或者B達到10個之後調用b,返回
echo 'sd f f [a b c cddd eee]' | sed ':n;s#\(\[[^ ]*\) *#\1#;tn' # 標籤函數t使用方法,替換[]裏的空格
echo "198723124.03"|sed -r ':a;s/([0-9]+)([0-9]{3})/\1,\2/;ta' # 每三個字符加一個逗號
}
引用外部變量{
sed -n ''$a',10p'
sed -n ""$a",10p"
}
sed 10q # 顯示文件中的前10行 (模擬"head")
sed -n '$=' # 計算行數(模擬 "wc -l")
sed -n '5,/^no/p' # 打印從第5行到以no開頭行之間的全部行
sed -i "/^$f/d" a      # 刪除匹配行
sed -i '/aaa/,$d' # 刪除匹配行到末尾
sed -i "s/=/:/" c # 直接對文本替換
sed -i "/^pearls/s/$/j/" # 找到pearls開頭在行尾加j
sed '/1/,/3/p' file # 打印1和3之間的行
sed -n '1p' file # 取出指定行
sed '5i\aaa' file # 在第5行以前插入行
sed '5a\aaa' file # 在第5行以後抽入行
echo a|sed -e '/a/i\b' # 在匹配行前插入一行
echo a|sed -e '/a/a\b' # 在匹配行後插入一行
echo a|sed 's/a/&\nb/g' # 在匹配行後插入一行
seq 10| sed -e{1,3}'s/./a/' # 匹配1和3行替換
sed -n '/regexp/!p' # 只顯示不匹配正則表達式的行
sed '/regexp/d' # 只顯示不匹配正則表達式的行
sed '$!N;s/\n//' # 將每兩行鏈接成一行
sed '/baz/s/foo/bar/g' # 只在行中出現字串"baz"的狀況下將"foo"替換成"bar"
sed '/baz/!s/foo/bar/g' # 將"foo"替換成"bar",而且只在行中未出現字串"baz"的狀況下替換
echo a|sed -e 's/a/#&/g' # 在a前面加#號
sed 's/foo/bar/4' # 只替換每一行中的第四個字串
sed 's/\(.*\)foo/\1bar/' # 替換每行最後一個字符串
sed 's/\(.*\)foo\(.*foo\)/\1bar\2/' # 替換倒數第二個字符串
sed 's/[0-9][0-9]$/&5' # 在以[0-9][0-9]結尾的行後加5
sed -n ' /^eth\|em[01][^:]/{n;p;}' # 匹配多個關鍵字
sed -n -r ' /eth|em[01][^:]/{n;p;}' # 匹配多個關鍵字
echo -e "1\n2"|xargs -i -t sed 's/^/1/' {} # 同時處理多個文件
sed '/west/,/east/s/$/*VACA*/' # 修改west和east之間的全部行,在結尾處加*VACA*
sed 's/[^1-9]*\([0-9]\+\).*/\1/' # 取出第一組數字,而且忽略掉開頭的0
sed -n '/regexp/{g;1!p;};h' # 查找字符串並將匹配行的上一行顯示出來,但並不顯示匹配行
sed -n ' /regexp/{n;p;}' # 查找字符串並將匹配行的下一行顯示出來,但並不顯示匹配行
sed -n 's/\(mar\)got/\1ianne/p' # 保存\(mar\)做爲標籤1
sed -n 's/\([0-9]\+\).*\(t\)/\2\1/p' # 保存多個標籤
sed -i -e '1,3d' -e 's/1/2/' # 多重編輯(先刪除1-3行,在將1替換成2)
sed -e 's/@.*//g' -e '/^$/d' # 刪除掉@後面全部字符,和空行
sed -n -e "{s/^ *[0-9]*//p}" # 打印並刪除正則表達式的那部份內容
echo abcd|sed 'y/bd/BE/' # 匹配字符替換
sed '/^#/b;y/y/P/' 2 # 非#號開頭的行替換字符
sed '/suan/r readfile' # 找到含suan的行,在後面加上讀入的文件內容
sed -n '/no/w writefile' # 找到含no的行,寫入到指定文件中
sed '/regex/G' # 在匹配式樣行以後插入一空行
sed '/regex/{x;p;x;G;}' # 在匹配式樣行以前和以後各插入一空行
sed 'n;d' # 刪除全部偶數行
sed 'G;G' # 在每一行後面增長兩空行
sed '/^$/d;G' # 在輸出的文本中每一行後面將有且只有一空行
sed 'n;n;n;n;G;' # 在每5行後增長一空白行
sed -n '5~5p' # 只打印行號爲5的倍數
seq 1 30|sed '5~5s/.*/a/' # 倍數行執行替換
sed -n '3,${p;n;n;n;n;n;n;}' # 從第3行開始,每7行顯示一次
sed -n 'h;n;G;p' # 奇偶調換
seq 1 10|sed '1!G;h;$!d' # 倒敘排列
ls -l|sed -n '/^.rwx.*/p' # 查找屬主權限爲7的文件
sed = filename | sed 'N;s/\n/\t/' # 爲文件中的每一行進行編號(簡單的左對齊方式)
sed 's/^[ \t]*//' # 將每一行前導的"空白字符"(空格,製表符)刪除,使之左對齊
sed 's/^[ \t]*//;s/[ \t]*$//' # 將每一行中的前導和拖尾的空白字符刪除
sed '/{abc,def\}\/\[111,222]/s/^/00000/' # 匹配須要轉行的字符: } / [
echo abcd\\nabcde |sed 's/\\n/@/g' |tr '@' '\n' # 將換行符轉換爲換行
cat tmp|awk '{print $1}'|sort -n|sed -n '$p' # 取一列最大值
sed -n '{s/^[^\/]*//;s/\:.*//;p}' /etc/passwd # 取用戶家目錄(匹配不爲/的字符和匹配:到結尾的字符所有刪除)
sed = filename | sed 'N;s/^/ /; s/ *\(.\{6,\}\)\n/\1 /' # 對文件中的全部行編號(行號在左,文字右端對齊)
/sbin/ifconfig |sed 's/.*inet addr:\(.*\) Bca.*/\1/g' |sed -n '/eth/{n;p}' # 取全部IP
修改keepalive配置剔除後端服務器{
sed -i '/real_server.*10.0.1.158.*8888/,+8 s/^/#/' keepalived.conf
sed -i '/real_server.*10.0.1.158.*8888/,+8 s/^#//' keepalived.conf
}
模仿rev功能{
echo 123 |sed '/\n/!G;s/\(.\)\(.*\n\)/&\2\1/;//D;s/.//;'
/\n/!G;       # 沒有\n換行符,要執行G,由於保留空間中爲空,因此在模式空間追加一空行
s/\(.\)\(.*\n\)/&\2\1/; # 標籤替換 &\n23\n1$ (關鍵在於& ,可讓後面//匹配到空行)
//D;       # D 命令會引發循環刪除模式空間中的第一部分,若是刪除後,模式空間中還有剩餘行,則返回 D 以前的命令,從新執行,若是 D 後,模式空間中沒有任何內容,則將退出。 //D 匹配空行執行D,若是上句s沒有匹配到,//也沒法匹配到空行, "//D;"命令結束
s/.//;       # D結束後,刪除開頭的 \n
}
}

xargs{# 命令替換-t 先打印命令,而後再執行-i 用每項替換 {}find / -perm +7000 | xargs ls -l # 將前面的內容,做爲後面命令的參數seq 1 10 |xargs -i date -d "{} days " +%Y-%m-%d # 列出10天日期}

相關文章
相關標籤/搜索