记录一些常用的linux shell命令

日期

取前一天

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

数组

var1=”small min”
echo $(var1)

截取字符串

# 从第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)
-gtn1 大於 n2 (greater than)
-ltn1 小於 n2 (less than)
-gen1 大於等於 n2 (greater than or equal)
-len1 小於等於 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语法
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文件

via

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命令行查询

updatedupdated2024-08-302024-08-30