日期
取前一天
date -d ‘1 days ago’ +%Y-%m-%d
命令別名設定功能: (alias)
alias ll=’ls -al’
一些特殊值
$$:(關於本 shell 的 PID)
$!:得到子进程的进程PID,例如nohup的命令可以通过这个获取PID
$?:(關於上個執行指令的回傳值)
$#: 参数个数
$@ :代表『 “$1” “$2” “$3” “$4” 』
$* :代表『 “$1c$2c$3c$4” 』,其中 c 為分隔字元
declare
数值计算要用 declare -i sum=100+12
也可以用sum=$((100+12))计算
[root@www ~]# declare [-aixr] variable
選項與參數:
-a :將後面名為 variable 的變數定義成為陣列 (array) 類型
-i :將後面名為 variable 的變數定義成為整數數字 (integer) 類型
-x :用法與 export 一樣,就是將後面的 variable 變成環境變數;
-r :將變數設定成為 readonly 類型,該變數不可被更改內容,也不能 unset
数组
截取字符串
# 从第0位开始截取2个字符
echo ${a:0:2}
删除/替换字符
echo ${PATH#/usr_:} #从前到后开始删除掉第一个符合条件的字符
echo ${PATH##/usr_:} #从前到后开始删除掉所有符合条件的字符
也可以从后面开始,就是把#号替换成%号
echo ${PATH/usr/USR} #替换
echo ${PATH//usr/USR} #替换所有
&&和||
可以把多条命令串起来,例如
ls ./test/||mkdir ./test/ #如果目录不存在,创建一个
判断
使用中括号时注意空格必须要有[ -e “xxx” ] 语法
if [ "$name" == "Fatkun" ]; then
echo "Hi!Fatkun"
elif [ ... ]; then
echo "..."
else
echo "..."
fi
測試的標誌 | 代表意義 |
1. 關於某個檔名的『檔案類型』判斷,如 test -e filename 表示存在否 | |
-e | 該『檔名』是否存在?(常用) |
-f | 該『檔名』是否存在且為檔案(file)?(常用) |
-d | 該『檔名』是否存在且為目錄(directory)?(常用) |
-b | 該『檔名』是否存在且為一個 block device 裝置? |
-c | 該『檔名』是否存在且為一個 character device 裝置? |
-S | 該『檔名』是否存在且為一個 Socket 檔案? |
-p | 該『檔名』是否存在且為一個 FIFO (pipe) 檔案? |
-L | 該『檔名』是否存在且為一個連結檔? |
2. 關於檔案的權限偵測,如 test -r filename 表示可讀否 (但 root 權限常有例外) | |
-r | 偵測該檔名是否存在且具有『可讀』的權限? |
-w | 偵測該檔名是否存在且具有『可寫』的權限? |
-x | 偵測該檔名是否存在且具有『可執行』的權限? |
-u | 偵測該檔名是否存在且具有『SUID』的屬性? |
-g | 偵測該檔名是否存在且具有『SGID』的屬性? |
-k | 偵測該檔名是否存在且具有『Sticky bit』的屬性? |
-s | 偵測該檔名是否存在且為『非空白檔案』? |
3. 兩個檔案之間的比較,如: test file1 -nt file2 | |
-nt | (newer than)判斷 file1 是否比 file2 新 |
-ot | (older than)判斷 file1 是否比 file2 舊 |
-ef | 判斷 file1 與 file2 是否為同一檔案,可用在判斷 hard link 的判定上。 主要意義在判定,兩個檔案是否均指向同一個 inode 哩! |
4. 關於兩個整數之間的判定,例如 test n1 -eq n2 | |
-eq | 兩數值相等 (equal) |
-ne | 兩數值不等 (not equal) |
-gt | n1 大於 n2 (greater than) |
-lt | n1 小於 n2 (less than) |
-ge | n1 大於等於 n2 (greater than or equal) |
-le | n1 小於等於 n2 (less than or equal) |
5. 判定字串的資料 | |
test -z string | 判定字串是否為 0 ?若 string 為空字串,則為 true |
test -n string | 判定字串是否非為 0 ?若 string 為空字串,則為 false。 註: -n 亦可省略 |
test str1 = str2 | 判定 str1 是否等於 str2 ,若相等,則回傳 true |
test str1 != str2 | 判定 str1 是否不等於 str2 ,若相等,則回傳 false |
6. 多重條件判定,例如: test -r filename -a -x filename | |
-a | (and)兩狀況同時成立!例如 test -r file -a -x file,則 file 同時具有 r 與 x 權限時,才回傳 true。 |
-o | (or)兩狀況任何一個成立!例如 test -r file -o -x file,則 file 具有 r 或 x 權限時,就可回傳 true。 |
! | 反相狀態,如 test ! -x file ,當 file 不具有 x 時,回傳 true |
case $變數名稱 in <==關鍵字為 case ,還有變數前有錢字號
"第一個變數內容") <==每個變數內容建議用雙引號括起來,關鍵字則為小括號 )
程式段
;; <==每個類別結尾使用兩個連續的分號來處理!
"第二個變數內容")
程式段
;;
*) <==最後一個變數內容都會用 * 來代表所有其他值
不包含第一個變數內容與第二個變數內容的其他程式執行段
exit 1
;;
esac <==最終的 case 結尾!『反過來寫』思考一下!
while语法
while [ condition ] <==中括號內的狀態就是判斷式
do <==do 是迴圈的開始!
程式段落
done <==done 是迴圈的結束
for…do…done语法
for var in con1 con2 con3 ...
do
程式段
done
CLUSTERS=(aaa bbb ccc)
for cluster in ${CLUSTERS[@]};
do
echo $cluster
done
for((i=1;i<100;i++));do
echo $i
done
软链接替换
ln -snf ./hive-0.7.1/ hive
利用grep和gawk,xargs来kill
xargs会把gawk的每一行变成kill的参数,如 kill 1 2 3 grep -v 是排除 ps -ef|grep scott|grep -v grep|gawk {‘print $1’}|xargs kill
sed命令替换文本
sed -i "s/oldstring/newstring/g" file #在原文件修改
sed "s/oldstring/newstring/g" file >file.new # 输出到其他文件
file="/tmp/crontab_`date +"%H%M%S"`.bak"; crontab -l > $file; sed "s/\*\/5 \* \* \* \* run-parts/\* \* \* \* \* run-parts/g" $file > "$file.new"; crontab "$file.new"; # 替换crontab文件
sed -r 's/^\s+([0-9]+) /\1|/g'
sed -i '$i\eeeeeeeee' urfile # 在倒数一行插入内容
tar
tar --exclude=log -cvzf xxx_`date +"%Y-%m-%d_%H_%M"`.tar.gz ./xxx
# 使用xz压缩,如果使用lzma压缩也是用XZ_OPT
XZ_OPT=-1 tar -cf 1.tar.xz --xz xx.log
获取机器IP
via:http://www.cnblogs.com/starspace/archive/2009/02/13/1390062.html
/sbin/ifconfig -a|grep inet|grep -v 127.0.0.1|grep -v inet6|awk '{print $2}'|tr -d "addr:"
GREP 获取前几行后几行的内容
grep -n -B1 -A1 "关键字" file #匹配关键字的前一行与后一行.
Rsync 通过ssh传输
# -e 参数指定用ssh传输
rsync --exclude 'logs' --size-only --progress -rave "ssh -p2222" /home/xx/ 用户名@IP地址:/tmp/xx
kill进程树
http://stackoverflow.com/questions/392022/best-way-to-kill-all-child-processes
gawk
gawk -F'|' 'BEGIN {OFS="|"}{print $1,$2,$3}'
gawk '{a=index($0, " from ");if(a>0){b=substr($0,a+6);print substr(b, 0, index(b, " "))}}'
gawk 'BEGIN{sum=0}{sum+=$1}END{print sum}' data.txt
输出一大段文本
cat <<'EOF' >> ./test.txt
XXX
EOF
简单的http服务
python -m SimpleHTTPServer 8080
## NC传文件接收方
/sbin/ifconfig |grep 'inet addr:10'
nc -l 9999 | tar zxvf -
发送方 tar czvf - ./xxx | nc server 9999
如果nc -l执行失败,下载旧版本 http://vault.centos.org/6.6/os/x86_64/Packages/nc-1.84-22.el6.x86_64.rpm
Find
find /tmp/ -mtime +1 -name 'xxx_*.log' -delete
find /tmp/ -mmin +60 -name 'xxx_*.log' -delete
date
dt=$(date +"%Y%m%d_%H%M%S")
用户/组管理命令
http://cnzhx.net/blog/linux-add-user-to-group/
# 把xxx加入apache组
usermod -a -G apache xxx
sort
# 按human readable 方式排序(sort -h)
hdfs dfs -du -h /user/|sed -r 's/([0-9.]*)[ ]/\1/'|sort -hr
# -t是分隔符
# 先按第一列排序,再按第二列数字排序
cat 1.txt |sort -t',' -k1,1 -k2,2n
截取kv文件
head 000000_0 |awk -v RS='`' -F'=' '$1=="keyname"'
head 000000_0 |grep -o '`keyname=[^`]*'
只复制目录结构
# 把dir1的目录结构复制到dir2内
find ./dir1 -type d -exec mkdir -p dir2/\{\} \;
shell重试方法
retry() {
local -r -i max_attempts="$1"; shift
local -r cmd="$@"
local -i attempt_num=1
until $cmd
do
if (( attempt_num == max_attempts ))
then
echo "Attempt $attempt_num failed and there are no more attempts left!"
return 1
else
echo "Attempt $attempt_num failed! Trying again in 60 seconds..."
echo $(( attempt_num++ ))
sleep 60
fi
done
}
# 使用方式
retry 6 echo "ok"
参考
大部分内容来自:http://linux.vbird.org/linux_basic/0320bash.php
linux命令行查询