目录
  1. 1. Bash命令行快捷键
  2. 2. echo
  3. 3. 变量
    1. 3.1. 特殊变量
    2. 3.2. 变量判断
    3. 3.3. 变量删除
    4. 3.4. 变量截取
    5. 3.5. 变量替换
  4. 4. 普通数组及关联数组
    1. 4.1. 普通数组
    2. 4.2. 关联数组
  5. 5. Alias
  6. 6. 进程替换
  7. 7. Dig
  8. 8. dd
  9. 9. curl
  10. 10. route
  11. 11. rsync
  12. 12. grep
  13. 13. sed
  14. 14. awk

 主要记录一些Bash及Bash脚本的技巧,方便快速查阅。不定期更新。。。。。。

Bash命令行快捷键

  • Ctrl + a:移到行首
  • Ctrl + e:移到行尾
  • Ctrl + f:按字符向右移
  • Ctrl + b:按字符向左移
  • Ctrl + u:光标处删除至行首
  • Ctrl + k:光标处删除至行尾
  • Ctrl + w:光标处删除至单词字首
  • Ctrl + h:删除光标前的字符(相当于Backspace键)
  • Ctrl + r:逆向搜索历史命令记录
  • Ctrl + p:历史命令中上一条
  • Ctrl + n:历史命令中下一条
  • Ctrl + l:清屏
  • Ctrl + z:挂起命令
  • Alt + .:上一命令的最后一个参数
  • Alt + f:按单词向右移
  • Alt + b:按单词向左移
  • !!:执行上一条命令

echo

  • echo忽略换行符

    1
    2
    #\n无效
    echo -n "echo_test\n"
  • echo字符串转义

    1
    2
    #转义\t
    echo -e '0\t1\t2'
  • echo终端颜色
     echo -e “\033[光标;前景;背景m 你要显示的内容 \033[0m”
     例子:echo -e “\033[0;30;41m It’s cool \033[0m”

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    光标代码  意义
    0 OFF
    1 高亮显示(粗体)
    2 亮度减半
    4 下划线
    5 闪烁
    7 反白显示
    8 不可见

    前景 背景 颜色
    30 40 黑色
    31 41 红色
    32 42 绿色
    33 43 黄色
    34 44 蓝色
    35 45 紫红色
    36 46 青蓝色
    37 47 白色

     echo终端颜色汇总


    echo_color

变量

特殊变量

  • $* 所有的位置参数的字符串(所有位置参数为一个整体的字符串)
  • $@ 所有的位置参数的列表(每个位置参数为单独个体)
  • $# 位置参数的数量
  • $0 当前脚本的路径
  • $$ 当前进程的PID
  • $? 上一个命令的退出码
  • $_ 上一个命令的最后一个参数
  • $! 上一运行的后台进程的PID
  • $- 当前的option flags

变量判断

表达式 解释
${ #var} var字符串长度
${var-default}/${var=default} var不存在则值为=default
${var:-default}/${var:=default} var不存在时值为default
${var+default} var存在则值为default
${var:+default} var存在时则值为default
${var?message} var不存在则打印message信息并以exit 1
${var:?message} var不存在则打印message信息并以exit 1

变量删除

表达式 解释 备注
${var#pattern} var左边开始删除最小匹配pattern的字符串 var='/usr/bin/vim' ${var#/*/} bin/vim
${var##pattern} var左边开始删除最长匹配pattern的字符串 var='/usr/bin/vim' ${var#/*/} vim
${var%pattern} var右边开始删除最小匹配pattern的字符串
${var%%pattern} var右边开始删除最长匹配pattern的字符串

变量截取

 Bash变量的位置从0开始标记,abc——>a(0)b(1)c(2)

表达式 解释 备注
${var:pos} var中截取从位置pos开始到最后的字符串(包含pos) var='12345' ${var:4} 5 (从位置为4开始截取[包括位置4])
${var:pos:len} var中截取从位置pos开始截取长度为len的字符串(包含pos) var='12345' ${var:1:3} 234 (从位置1开始截取长度为3的字符串[包含位置1])

变量替换

表达式 解释 备注
${var/pattern/replace} var最长匹配pattern并用replace将其替换(仅替换第一次出现的pattern) var='123_test_456_test' ${var/test/replace} 123_replace_456_test
${var//pattern/replace} var最长匹配pattern并用replace将其全部替换 var='123_test_456_test' ${var//test/replace} 123_replace_456_replace

普通数组及关联数组

普通数组

  • 创建

    1
    2
    3
    array=(one two three four five)

    array[0]="one"array[1]="two" ......
  • 获取数值

    • 获取具体元素数值

      1
      echo ${array[0]}
    • 获取所有元素数值

      1
      echo ${array[@]}	/	echo ${array[*]}
  • 获取数组长度

    1
    echo ${#array[@]}
  • 获取索引

    1
    echo ${!array[@]}

关联数组

 关联数组需要Bash版本高于4.0才支持

  • 创建

    1
    2
    declare -A as_array
    as_array=([index0]=one [index1]=two [index2]=three [index3]=four)
  • 获取数值

    • 获取具体元素数值

      1
      echo ${as_array[index0]}
    • 获取所有元素数值

      1
      echo ${as_array[@]}	/	echo ${as_array[*]}
  • 获取数组长度

    1
    echo ${#as_array[@]}
  • 获取索引

    1
    echo ${!as_array[@]}

Alias

  • alias接收命令行参数
    alias设置别名命令时是无法通过命令行接收参数的,但可以通过构建函数实现此功能

    1
    alias psg='psg(){ ps aux|grep "$1"; };psg'
  • alias中''内引用''
     转义——‘\’’

    1
    alias xgrep='awk -F":" '\''{print \$1}'\'' '
  • 消除alias
     在命令行中,有时想要不使用alias别名命令而是使用原生命令,可强制取消alias别名命令

    1
    \rm file_name

进程替换

 进程替换(>(command) <(command))和命令替换($())类似,将一个进程的输出转给另一个进程
 使用进程替换需要Bash支持,进程替换是非POSIX兼容的。使用了进程替换的脚本需要用bash script_name.sh而不能用sh script_name.sh执行。尽管/bin/sh/bin/bash的软链接,当使用sh执行脚本时,就会启用POSIX兼容,进程替换是非POSIX兼容的。

1
read SSH_HOST SSH_USER SSH_PWD SSH_PORT< <(echo "$eachLine"|awk '{print $1,$2,$3,$4}')

Dig

dig命令主要用于查询DNS相关内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 域名解析
$> dig www.google.com

# 指定域名服务器查询
$> dig www.google.com @ns1.dnspod.net

# 指定查询类型
$> dig -t mx gmail.com

# 反向查询
$> dig -x 216.58.221.100

# 使用TCP方式查询
$> dig +tcp www.google.com

# 追踪dig查询过程
$> dig +trace www.google.com

# 精简dig结果
$> dig +short www.google.com

dd

 生成指定大小文件

1
dd if=/dev/zero of=test.img bs=1M count=1000

  • if:输入文件
  • of:输出文件
  • bs:块大小
    • c:字节(1B)
    • w:字(2B)
    • b:块(512B)
    • k:千字节(1024B)
    • M:兆字节(1024KB)
    • G:吉字节(1024MB)
  • count:块数

curl

  • 保存页面

    1
    curl -o google.html http://www.google.com
  • 静默输出
     不输出错误消息及执行过程

    1
    curl -s http://www.google.com
  • POST JSON数据
    -X——指定方法
    -H——指定HTTP HEADER
    -d——指定数据

    1
    curl -X POST -H "Content-Type: application/json" -d '{"status":500,"msg":"fail","code":'$CODE',"appid":"'$APPID'","reqCode":"'$REQCODE'"}' http://example.com/api
  • 跟踪重定向

    1
    curl -L http://example.com
  • 获取HTTP HEADER

    1
    curl -I http://example.com
  • 认证

    1
    curl -u username:passowrd http://example.com

route

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 显示路由表
route -n

# 添加默认路由
route add default gw [eth0|192.168.1.1]

# 添加一条到达192.168.2.0网络的路由,指定网络掩码为255.255.255.0,数据包通过网络接口eth0
route add -net 192.168.2.0 netmask 255.255.255.0 dev eth0
route add -net 192.168.2.0/24 dev eth0

# 所有去往192.57.66.200主机的数据包发往网关地址192.168.2.1
route add -host 192.57.66.200 gw 192.168.2.1

# 添加一条到达192.57.66.0网络的路由,指定网络掩码为255.255.255.0,数据包通过网关地址192.168.2.1
route add -net 192.57.66.0 netmask 255.255.255.0 gw 192.168.2.1

# 删除到主机192.168.1.11的路由
route del –host 192.168.1.11 dev eth0

rsync

  • rsync拉取同步

    1
    /usr/bin/rsync -azv --delete rsync_user@rsync_ip::rsync_module /path/to/dest_dir/ --password-file=/path/to/password.file
    • --delete
      将目标处多余的删除,既使得目标与源的文件完全一致,慎用此参数。
    • -a
      归档模式,表示以递归方式传输文件,并保持所有文件属性,等于-rlptgoD
    • -z
      对备份的文件在传输时进行压缩处理
    • -v
      详细模式输出
    • -n
      查看哪些文件将被传输,并非实际传输,即--dry-run
  • rsync推送同步

    1
    /usr/bin/rsync -azv --delete /path/to/source_dir/  rsync_user@rsync_ip::rsync_module --password-file=/path/to/password.file
  • 排除目录

    1
    /usr/bin/rsync -azv --delete --exclude='/paht/to/exclude_dir1/' --exclude='/path/to/exclude_dir2/' rsync_user@rsync_ip::rsync_module /path/to/dest_dir/ --password-file=/path/to/password.file
  • rsync断点续传
     让rsync使用ssh协议,代替scp并实现断点续传功能

    1
    rsync -P --rsh='ssh -p2222' ssh_user@ssh_ip:file_name.tar.gz /tmp
  • rsync过滤规则
     指定rsync只同步某类型文件并保持文件所在的目录结构

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    # 只同步jpg文件(递归同步,即子目录下的所有jpg文件也同步)(-! */ 匹配所有非目录文件)
    /usr/bin/rsync -azv --include="*.jpg" --filter="-! */" appNginx@10.0.1.153::www /tmp/www_rsync/ --password-file=/etc/rsyncd/rsync.pwd

    # 只同步jpg、png文件(递归同步,即子目录下的所有jpg、png文件也同步)
    /usr/bin/rsync -azv -f '+ *.jpg' -f '+ *.png' -f '+ */' -f '- *' appNginx@10.0.1.153::www /tmp/www_rsync/ --password-file=/etc/rsyncd/rsync.pwd

    # 只同步jpg文件(递归同步,即子目录下的所有jpg文件也同步)
    /usr/bin/rsync -azv --include="*.jpg" --include="*.png" --include="*/" --exclude="*" appNginx@10.0.1.153::www /tmp/www_rsync/ --password-file=/etc/rsyncd/rsync.pwd

    # 只同步jpg文件(非递归同步,仅仅同步该目录的jpg文件,目录下的子目录不会同步也不会创建)
    /usr/bin/rsync -azv --include="*.jpg" --exclude="*" appNginx@10.0.1.153::www /tmp/www_rsync/ --password-file=/etc/rsyncd/rsync.pwd

    # 只同步jpg文件(非递归同步,仅仅同步该目录的jpg文件,目录下的子目录不会同步也不会创建)
    /usr/bin/rsync -azv -f '+ *.jpg' -f '+ *.png' -f '- *' appNginx@10.0.1.153::www /tmp/www_rsync/ --password-file=/etc/rsyncd/rsync.pwd

grep

1
2
3
4
5
6
7
8
9
#利用grep提取IP地址
grep -Po "(\d+\.)(\d+\.)(\d+\.)\d+"
grep -Po "(\d+)(\.\d+){3}"

#grep perl正则
echo "sd,1563k%135"|grep -Po '(?<=,).*(?=%)'

#获取日志http状态码
grep -Po '(?<=HTTP/1.[01]" )(\d{3})(?= )'

sed

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#在State所在行前添加一行空白行
sed -i '/State/i \\'

#在匹配式样“regex”的行之前插入一空行
sed '/regex/{x;p;x;}'

#在匹配式样“regex”的行之后插入一空行
sed '/regex/G'

#在匹配式样“regex”的行之前和之后各插入一空行
sed '/regex/{x;p;x;G;}'

#在每行后添加空行
sed -i G

#在每个字符后添加空格(abc—>a b c )
sed -r 's/(.)/\1 /g'

#sed获取文件行数
sed -n '$=' filename

#sed替换多个关键字为一个
sed -i -r 's/2|3|4/test/g' test.txt

#在文件行首添加行号
sed = test.txt | sed 'N;s/\n/ /'

#仅为非空白行在行首添加行号
sed /./= test.txt | sed 'N;s/\n/ /'

#单词首字母大写
echo $mogltest|sed 's/\b[a-z]/\U&/'

#大写转小写
echo "ABC"|sed 's/[A-Z]/\l&/g'

#sed正则匹配'或'需要对|做转义\|
sed '/one\|two\|three/ s/^/#/' test.txt

#多个,替换成一个,(正则+需要转义)
sed 's/,\+/,/g' test.txt

#全文本替换\n
sed ':a N;$! ba;s/\n/ /g' test.txt

#sed递归替换
grep -rl 'test' dir/ | xargs sed -i 's/test/mogl/g'

awk

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#awk去除重复行
awk '!a[$0]++' filename

#pattern为要替换的模式;substitute为要替换为什么形式;field可选,表示替换范围,默认为整行,可指定$2$3(gsub 多次替换)
awk 'sub(/pattern/, substitute, [field])'
awk '/access_log/ {sub(/access.log/, "", $2);print $2}' appmgr.conf 删除$2"access.log"字符串并打印剩余的$2

#在file1中的key前插入file2文本的内容
awk '/key/{system("cat file2")}1' file1

#在file1中的key后插入file2文本的内容(sed '/key/r file2' file1)
awk '1;/key/{system("cat file2")}' file1

#shell中用awk比较浮点数大小
awk -va=0.5 -vb=0.7 'BEGIN{print (a>b)?"0":"1"}'

#统计TCP状态信息
netstat -anl|awk '/^tcp/ {s[$NF]++} END{for(a in s) print a,s[a]}'

#统计每个IP访问量
netstat -anl|awk -F'[ :]+' '/^tcp/ && $6!~/0.0.0.0/ && $6~/[0-9]\.[0-9]/ {ip[$6]++} END{for(a in ip) print ip[a],a}'|sort -nr

#统计进程数前十
ps aux|awk '{a[$NF]++} END{for(i in a) print a[i],i}'|sort -nr|column -t|head

#awk正则引用外部变量及单引号内引用外部变量
aaa="abc";awk '/'"$aaa"'/ {print "'$aaa'"}' test.txt

#当正则引用外部变量仅需单引号不可有双引号,即可/'$eachItem'/,不可/"'$eachItem'"/
awk '/check_command/ && /'$eachItem'/ && !/#/ {print NR}' $NAGIOS_FILE

#分隔符为'[]'需写成"-F'[][]+'""-F '[\\[\\]]+'"
awk -F'[][]+' '!/#/ && /command\[/ {print $2}' test.txt

#awk转小写(大写toupper())
echo "ABC"|awk '{print tolower($2)}'

#shell引用awk内的变量/awk向shell传递变量
eval $(awk 'BEGIN{for(i=1;i<7;i++) {printf("D%s=%s\n", i,i)}}')
eval $(awk '{printf("var1=%s; var2=%s; var3=%s;",$1,$2,$3)}' abc.txt)
eval $(awk 'BEGIN{print "var1='str1';var2='str2'"}')

#awk实现矩阵互换(filename有5行数据)
for i in `echo 1 2 3 4 5`;do awk '{printf $'$i'"\t"}END{print ""}' filename ;done

#awk使用正则表达式
awk --re-interval '/\<a{2,3}\>/' test.txt

#awk调用sort排序
awk '{ip[$1]++} END{for(a in ip) print ip[a],a|"sort -nr"}' test.txt

#awk统计数组长度
awk '{ip[$1]} END{print length(ip)}' test.txt

#awk空格替换成_,大写转成小写
echo 'a b c'|awk '{gsub(/ +/,"_",$0);print tolower($0)}'

Powered: Hexo, Theme: Nadya remastered from NadyMain