[关闭]
@Great-Chinese 2017-03-03T11:47:55.000000Z 字数 6120 阅读 848

Shell编程入门

Shell编程入门


1.0 Shell特性

A:命令历史

  1. ls ~/.bash_history 查看root用户的命令历史所在路径
  2. echo $HISTSIZE
  3. !! 表示上一条命令
  4. !$ 上一条命令的最后一个参数
  5. !950 运行第950条的命令
  6. !c 从下向上看,命令以C开头的命令

B:Tab键 补全

C: 别名 alias

  1. alias melody='cat a.txt'
  2. unalias melody 取消别名

D:通配符

  1. ls *.txt 显示所有以.txt结束的文件
  2. ls 1* 显示所有以1开头的目录或文件
  3. ls ?.txt 匹配只有一个字符(单个数字,单个字母)

E:管道符 把一个命令的结果丢给另一个命令

  1. cat /etc/passwd |wc -l

F:重定项

  1. echo "melody0113" > a.txt 覆盖原文件(重定项)
  2. echo "melody0113" >> a.txt 追加
  3. wc -l < a.txt 反向重定项(把一个文件的内容丢给另一个命令)
  4. ls 1111 2> a.txt 错误重定项
  5. ls 1111 2>> a.txt 追加错误重定项

G:ctrl z 暂定

  1. jobs 查看暂定的任务
  2. fg 调到前台运行
  3. bg 调到后台运行

1.1 shell变量

A:系统变量

  1. env 查看系统变量
  2. echo $HOSTNAME 查看一个变量的内容
  3. set 显示系统环境变量与自定义变量、额外的变量
  4. a=1; b=2
  5. echo $a $b

B:变量的规则

变量名由字母、下划线、数字组成,但不能以数字开头,避免用系统命令、关键字,大写字母做变量名。

1.1.1,双引号

  1. a="ls /tmp",当变量内有特殊字符时需要使用双引号引起来,空格也是特殊字符。

1.1.2 反引号

  1. myvim=`which vim`
  2. echo $myvim
  3. /usr/bin/vim

1.1.3变量相结合

  1. echo $a
  2. ls /tmp
  3. c="$a"12
  4. echo $c
  5. ls /tmp12
  6. d=$myvim$a
  7. echo $d
  8. /usr/bin/vim ls /tmp

1.1.4 如何在子shell中使用自定义变量

  1. export a="ls /tmp" 全局申明
  2. bash 进入bash这个子shell
  3. echo $a 显示变量
  4. ls /tmp

1.1.5 取消变量

  1. unset d #将之前定义的变量取消
  2. echo $a #这样就不显示值了

要想让变量无论在shell还是子shell都生效需要将变量加入vim /etc/profile

1.2 系统和用户的环境变量配置文件

A:系统相关的配置文件

  1. ls /etc/profile 查看profile文件
  2. vim /etc/profile 进入此文件
  3. vim /etc/profile.d/path.sh 重新定义一个SH文件
  4. source /etc/profile 让修改的/etc/profile生效
  5. echo $PATH

B:bashrc (定义$PS1即前缀,UMASK)

  1. vim /etc/bashrc
  2. echo $PS1
  3. [\u@\h \W]\$
  4. PS1='[\u@\h \w]\$ ' W改成w,会显示绝对路径
  5. cd /etc/init.d/
  6. PS1='[\u@\h\t \w]\$ ' t显示时间
  7. PS1='[\u@\h-\t \w]\$ ' 加-在时间前面带-
  8. PS1='[\u@\h \W]\$ ' 返回到最初的状态
  9. ls /etc/bashrc 查看bashrc文件
  10. vim /etc/bashrc 进入此文件
  11. vim /etc/profile.d/umask.sh 重新定义一个SH文件
  12. source /etc/profile 让修改的/etc/profile生效

C:查看用户的家目录

  1. ls -la
  2. vim.bash_profile 定义用户自己的环境变量
  3. vim.bashrc 定义用户的别名

1.3 shell特殊符号

?表示一位,文本中
\ 脱意符 ls #1.txt 改变#号原有含义
| 管道符 把前面的命令交给后面的处理
使表示上条命令最后一个参数
;常用于两条命令中间,表示两条命令写一起
~ 代表用户家目录
& 把一个命令丢到后台,&& 把2个命令丢一起

  1. *通配符, #注释本行

1.4 cut 命令 (把一个文件分段)

  1. cut -d: -f 3 /etc/passwd (-d:分隔符, -f第几段)
  2. cut -d: -f 3-5 /etc/passwd (范围值3-5)
  3. cut -c 10 /etc/passwd 显示第10个字符,即截取字符

1.5 sort 命令(排序作用,默认以ASCII码 排序)

格式:sort /etc/passwd
-t 分隔符
-k 选择第几段
-n 使用纯数字排序(如果是字母的话,会把它看成0)
-r 反序排序,最小的在下面
-u 排序内容,但不去重复
-un 字母开头的会识别成重复内容,如skj1 a weotj 都会认为是重复内容,只显示数字内容

  1. sort -t: -k3 /etc/passwd 以:为分隔符,按照第3段内容排序
  2. sort -t: -k3,5 /etc/passwd 以:为分隔符,显示35段的内容
  3. sort -t: -k3 -n /etc/passwd 以数字排序
  4. sort -t: -k3 -nr /etc/passwd 反序排序
  5. sort -u 2.txt == sort 2.txt |uniq

1.6 wc 命令

  1. wc -l 计算一个文档的行数 可适用多个文件,会分别列出并计算总和
  2. wc -w 计算文档的单词个数
  3. wc -m 显示文档包含多少个字符,换行符也算一个符号

1.7 uniq和tee命令

A: uniq去重复,还能计出有多少行重复

  1. sort 2.txt |uniq -c 先排序,再去重复

如果只是有uniq -c选项则只会统计出两个连续相同数字,比较笨

B: tee重定向

  1. echo "12345" > 1.txt 不显示信息在当前屏幕
  2. echo "123456" | tee 1.txt 把正确输出信息定向到一个文件中,并且在当前屏幕显示

1.7 tr和split命令

A:tr 替换字符

  1. ls *.txt 查看所有文件
  2. 1.txt 1.txt 2.txt 3.txt
  3. ls *.txt |tr 'a-z' 'A-Z' 把所有文件的小写字母替换成大写字母
  4. echo "adaladkwodjiwierjfdispaeijfidskeji" |tr 'a' 'A' 编辑一个文档,把文档内所有a字母替换成A字母
  5. echo "adaladkwodjiwierjfdispaeijfidskeji" |tr 'a-z' 'A-Z'
  6. echo "adaladkwodjiwierjfdispaeijfidskeji" |tr 'a-f' 'A-F'

B:split 切割大文件

  1. split -b 100 1.txt 以文档大小来切割
  2. split -l 10 1.txt 以文档行数来切割
  3. wc -l anaconda-ks.cfg 查看文档行数
  4. du -sb anaconda-ks.cfg 查看文档大小
  5. split -b 30g anaconda-ks.cfg new_ 指定文件拆分后的文件名前缀

1.8 shell中连接符(并且、和、或者)

&& 左边命令执行成功后,才会执行右边的命令
|| 左边命令执行不成功,才会执行右边的命令
; 左边命令执行成功与否,后边命令都会执行成功

1.9 grep -1 (相关选项)过滤出指定的行

  1. grep --color -n 'root' /etc/passwd 显示颜色与行数
  2. alias cg='grep --color'
  3. vim .bashrc 如果想永久的使用cg这个别名,就需要编辑此文件
  4. cg -c 'root' 1.txt 显示出现了几行
  5. cg -n 'root' 1.txt 显示行号
  6. cg -v 'root' 1.txt 取反,指显示不包含root的行
  7. cg -n -A 2 'root' 1.txt 显示下面2
  8. cg -n -B 2 'games' 1.txt 显示下面2
  9. cg -n -C 2 'games' 1.txt 上面,下面2行都显示
  10. cg -r 'iptables' /etc/* 显示所有目录和文件
  11. cg -rh 'iptables' /etc/* 只显示结果,前面的文件名不显示

2.0 grep -2

  1. cg '[0-9]' 1.txt 显示以数字开头的文件和目录
  2. cg '[a-zA-Z]' 1.txt 显示所有大小写字母
  3. cg -v '[a-zA-Z]' 1.txt 取反
  4. cg '^[a-z]' 1.txt 显示以小写字母开头的文件和目录
  5. cg '^[0-9]' 1.txt 显示以数字开头的文件和目录
  6. cg '[^0-9]' 1.txt 显示非数字开关的文件和目录
  7. cg '^[^0-9]' 1.txt 显示非数字开关的文件和目录,不可以是空行
  8. cg -v '^[0-9]' 1.txt 显示非数字开关的文件和目录,可以是空行
  9. cg '^$' 1.txt 显示空行
  10. cg -v '^$' 1.txt 显示空行之外的行
  11. cg 'r.o' 1.txt .表示任意的字符
  12. cg 'r*o' 1.txt *表示任意多个r都可以匹配,只要与o连在一起
  13. cg 'r.*o' 1.txt 表示任意多个任意字符
  14. cg 'r/?o' 1.txt
  15. cg -E 'r/?o' 1.txt

2.1 grep -E ==egrep

  1. grep --color 'r\?o' 1.txt ==egrep -- 'r?o' 1.txt
  2. egrep --color 'r+o' 1.txt
  3. egrep --color 'root|nologin' 1.txt 或者
  4. grep --color 'root' 1.txt |grep --color 'nologin' 并且
  5. egrep --color '(rr)+' 1.txt 表示一个整体
  6. grep -E --color '(rr)+' 1.txt
  7. grep -E --color '(rr){1,3}' 1.txt 指定次数
  8. grep -E --color '\(rr)\{1,3\}' 1.txt

. 表示任意一个字符
* 表示0个或多个前面的字符
.
表示任意个任意字符
? 表示0个或1个?前面的字符
+ 表示1个或多个+前面的字符

  1. notes: ? + () {} | 这些符号需要脱意,egrep , -E
  2. grep,sed 只可以使用'.' '*' '.*' 这三个符号,
  3. egrep,awk都可以使用'.' '*' '.*' '+' '?' 这五个符号

2.2 awk命令-1 ---不支持{},sed,grep是支持的

  1. awk -F':' 'OFS="," {a[$7]=a[$7]+1};END {for(i in a)print i , a[i]}' 4.txt
  2. #打印第3段内容
  3. awk -F ':' '{print $3}' 1.txt
  4. #打印第3段,第4段内容
  5. awk -F ':' '{print $3,$4}' 1.txt
  6. #增加分隔符:,打印第3段,第4段内容
  7. awk -F ':' 'OFS=":"{print $3,$4}' 1.txt
  8. #匹配user,root行
  9. awk '/user|root/' 1.txt
  10. awk '/r*o/' 1.txt
  11. awk '/r?o/' 1.txt
  12. awk '/r+o/' 1.txt
  13. awk '/r.*o/' 1.txt
  14. #根据段匹配
  15. awk -F ':' '$1~/r*o/' 1.txt
  16. #精准匹配,精准打印
  17. awk -F ':' '$1~/r*o/ {print $3}' 1.txt
  18. #多次匹配,可加分号(两个规则,就会加印2次)
  19. awk -F ':' '$1~/r*o/ {print $1,$3}; $1~/nobody/ {print $1,$3}' 1.txt
  20. #一个规则,就只会打印1次
  21. awk -F ':' '$1~/r*o|nobody/ {print $1,$3}' 1.txt

2.3 awk-2 命令 条件操作符

  1. #显示第一段为nobody的行
  2. awk -F ':' '$1=="nobody"' 1.txt
  3. #显示第一段为nobody的行,或者第7段包含nolog的
  4. awk -F ':' '$1=="nobody" || $7~/nolog/' 1.txt
  5. #第3段大于等于80的行,
  6. awk -F ':' '$3>=80' 1.txt
  7. #第7段不等于/sbin/nologin的行
  8. awk -F ':' '$7!="/sbin/nologin"' 1.txt
  9. #第7段不匹配/nolog/的行
  10. awk -F ':' '$7!~/nolog/' 1.txt
  11. #第3段小于第4段的行
  12. awk -F ':' '$3<$4' 1.txt
  13. #第3段等于第4段的行
  14. awk -F ':' '$3==$4' 1.txt

2.4 awk-3 命令 内指变量

  1. #打印前10行的值
  2. awk -F ':' 'NR<10' 1.txt
  3. awk -F ':' 'NR>10' 1.txt
  4. awk -F ':' 'NR==10' 1.txt
  5. #只打印第10行中第1段,第5段的值
  6. awk -F ':' 'NR==10 {print $1,$5}' 1.txt
  7. awk -F ':' '{if (NR==10) print $1,$5}' 1.txt
  8. #打印有多少段(7段)
  9. awk -F ':' '{print NF}' 1.txt
  10. #满足有7段的条件,并打印第1段
  11. awk -F ':' '{if (NF==7) print $1}' 1.txt
  12. #打印第1段,第7段
  13. awk -F ':' '{print $NR, $NF}' 1.txt
  14. #赋值,打印整行
  15. awk -F ':' 'OFS=":" {$7=$3+$4; print $0}' 1.txt
  16. #赋值,打印第1段,第3段
  17. awk -F ':' 'OFS=":" {$7=$3+$4; print $1,$3}' 1.txt
  18. #循环,所有的第3段相加,再求和
  19. awk -F ':' '{(sum=sum+$3)};END {print sum}' 1.txt

2.5 sed -1 命令

  1. #只打印第10行的内容
  2. sed -n '10'p 1.txt
  3. #打印所有的行,到第10行时,再多打印一次
  4. sed '10'p 1.txt
  5. #指定范围,打印1-10行
  6. sed -n '1,10'p 1.txt
  7. #指定范围,打印10-未行
  8. sed -n '10,$'p 1.txt
  9. #指定范围,打印含有root的行
  10. sed -n '/root/'p 1.txt
  11. sed -n '/r.o/'p 1.txt
  12. sed -n '/r*o/'p 1.txt
  13. sed -n '/r+o/'p 1.txt
  14. #以下几种表达方式需要脱意
  15. sed -n '/r\?o/'p 1.txt
  16. sed -n '/r\+o/'p 1.txt
  17. #
  18. sed -n '/root\|nologin/'p 1.txt
  19. sed -n -r '/root|nologin/'p 1.txt
  20. #
  21. sed -n '/\(oo\)\+/'p 1.txt
  22. sed -r -n '/(oo)+/'p 1.txt
  23. #打印以非数字开头的
  24. sed -n -r '/[^0-9]/'p 1.txt
  25. #打印以非大小写字母开头的
  26. sed -n -r '/[^a-zA-Z]/'p 1.txt
  27. #显示空行
  28. sed -n -r '/^$/'p 1.txt
  29. # 删除空行
  30. sed '/^$/'d 1.txt
  31. #删除所有带大小写字母的行
  32. sed '/[a-zA-Z]/'d 1.txt
  33. #删除所有带数字的行
  34. sed '/[0-9]/'d 1.txt
  35. #删除1至19行,只是显示在屏幕上,原文件没有真正删除
  36. sed '1,19'd 1.txt
  37. #加 -i,会删除原文件,一般不建议用,会误删
  38. sed -i '1,19'd 1.txt

2.6 sed命令-2替换功能

  1. # 把1,10行dj替换成bj
  2. sed '1,10s/dj/bj/g' 1.txt
  3. # 把整行都替换成1212
  4. sed 's/^.*$/1212/g' 1.txt
  5. # 所有行的末尾都加上1212,并且1212前面有空格
  6. sed 's/^.*$/& 1212/g' 1.txt
  7. # 把所有行中的数字都删除
  8. sed 's/[0-9]//g' 1.txt ??????????????????如果带^,为什么结果不一样
  9. sed 's/[a-z,A-Z]//g' 1.txt

2.7 ntpdate

  1. #时间同步命令
  2. ntpdate time.windows.com
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注