首先还是回顾一下上次课堂几个重点内容:通配符、shell变量、输入输出重定向、作业控制、Shell 变量。
1.通配符
符号 | 意义 |
* | 代表0-无穷个 任意字符 |
? | 代表有且只有一个字符 |
[ ] | 代表有且仅有一个字符,且为[...]中所枚举的其中一个, 如 [13579] |
[-] | 同上,只不过是一个范围,如[ 0-9 ],[a-z]等 |
[^] | 有且仅有一个,且不是所枚举的任何字符,如:[^a-zA-Z] 代表该位不是字母 |
扩展实例:过滤配置文件的非空行和非注释行
[root@localhost etc]# cat chrony.conf
# Use public servers from the pool.ntp.org project.
# Please consider joining the pool (http://www.pool.ntp.org/join.html).
server 0.centos.pool.ntp.org iburst
server 1.centos.pool.ntp.org iburst
server 2.centos.pool.ntp.org iburst
server 3.centos.pool.ntp.org iburst
# Record the rate at which the system clock gains/losses time.
driftfile /var/lib/chrony/drift
# Allow the system clock to be stepped in the first three updates
# if its offset is larger than 1 second.
makestep 1.0 3
# Enable kernel synchronization of the real-time clock (RTC).
rtcsync
# Enable hardware timestamping on all interfaces that support it.
#hwtimestamp *
# Increase the minimum number of selectable sources required to adjust
# the system clock.
#minsources 2
[root@localhost etc]# cat chrony.conf |egrep -v "^#|^$ " //过滤以#开头和非空字符
server 0.centos.pool.ntp.org iburst
server 1.centos.pool.ntp.org iburst
server 2.centos.pool.ntp.org iburst
server 3.centos.pool.ntp.org iburst
driftfile /var/lib/chrony/drift
makestep 1.0 3
rtcsync
1.2扩展实例:过滤文档中的大小写字母
[root@localhost /]# cat 1.txt |egrep [A-Z]
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
[root@localhost /]# cat 1.txt |egrep [A-z] //这样是不可以的
grep: Invalid range end
这里涉及到ASCII编码!
2. ASCII编码:ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言。它是现今最通用的单字节编码系统,并等同于国际标准ISO/IEC 646。
这里看到A-z中间还有别的字符所以不能直接这样过滤!
3.错误重定向
3.1为了重定向标准错误,可以指定文件描述符2。
grep命令没有找到该文件,缺省地向终端输出了一个错误信息。现在让我们把错误重定向到文件/dev/null中(实际就上是系统的垃圾箱):
[root@localhost /]# grep "trident" 2.txt 2>/dev/null
[root@localhost /]#
这样所有的错误输出都输送到了/dev/null,不再出现在屏幕上。
3.2 shell中可能经常能看到:>/dev/null 2>&1 //即忽略所以输出信息。
详解:标准输出"不写即为标准输出1"的内容输出到/dev/null"recycle bin",
2"标准错误"的内容输出到1【标准输出】的位置即"recycle bin".
Shell会自动为我们打开和关闭0、1、2这三个文件描述符,我们不需要显式地打开或关闭它们。标准输入是命令的输入,默认指向键盘;标准输出是命令的输出,默认指向屏幕;标准错误是命令错误信息的输出,默认指向屏幕。
如果没有显式地进行重定向,命令通过文件描述符0从屏幕读取输入,通过文件描述符1和2将输出和错误信息输出到屏幕。但如果我们想从其他文件(再次强调,I/O设备在Unix/Linux中也是文件)读取输入或产生输出,就需要对0、1、2使用重定向了。
3.3 重定向的使用有如下规律:
1)标准输入0、输出1、错误2需要分别重定向,一个重定向只能改变它们中的一个。
2)标准输入0和标准输出1可以省略。(当其出现重定向符号左侧时)
3)文件描述符在重定向符号左侧时直接写即可,在右侧时前面加& [类似于指针前要加*号,来区分这、两种情况]。
4)文件描述符与重定向符号之间不能有空格!
4.shell变量
4.1 变量命名规则:变量名必须以字母或下划线打头,名字中间只能由字母、数字和下划线组成
变量名在有效范围内必须是唯一的
4.2 用户自定义变量
[root@localhost /]# name=knight //用户自定义变量
[root@localhost /]# echo $name //变量的调用
knight
[root@localhost /]# fullname="$name+lai" //变量的叠加
[root@localhost /]# echo $fullname
knight+lai
4.3 set 查看系统下所有已经生效的变量,包括系统的环境变量和用户自定义变量。
-u 选项 执行 set -u 命令以后,如果调用没有声明的变量时会报错。
[root@localhost /]# echo $a
[root@localhost /]# set -u
[root@localhost /]# echo $a //出现错误提示
-bash: a: unbound variable
取消变量:unset
[root@localhost /]# a=1
[root@localhost /]# echo $a
1
[root@localhost /]# unset a //取消了变量就调取不了
[root@localhost /]# echo $a
-bash: a: unbound variable
4.4 环境变量
4.4.1source 命令
source 环境变量配置文件名 或者 . 环境变量配置文件名
# 修改配置文件后,必须注销重新登录才能生效,使用source 命令可以不用重新登录
PATH、HISTSIZE、PS1、HOSTNAME等环境变量写入对应的环境变量配置文件
环境变量配置文件中主要是定义对系统操作环境生效的系统默认的环境变量,如PATH等。
- /etc/profile 用户环境变量,交互登录才执行
- /etc/bashrc 用户不用登录,执行shell就生效
- /etc/profile.d/*.sh
- ~/.bash_profile
- ~/.bashrc
- ~/.bash_history
- ~/.bash_logout 用户退出后需要做的一些操作
在/etc/目录下的配置文件会对所有用户生效,放在家目录的配置文件,只会对当前用户生效。
4.4.2 PS1=[\u@\h \W]$
[root@localhost /]$PS1='[\h@\u \W]'$
[localhost@root /]$ //主机名在前了 用户名 当前工作目录
PS1的常用参数以及含义:
\d :代表日期,格式为weekday month date,例如:"Mon Aug 1"
\H :完整的主机名称
\h :仅取主机名中的第一个名字
\t :显示时间为24小时格式,如:HH:MM:SS
\T :显示时间为12小时格式
\A :显示时间为24小时格式:HH:MM
\u :当前用户的账号名称
\v :BASH的版本信息
\w :完整的工作目录名称
\W :利用basename取得工作目录名称,只显示最后一个目录名
\# :下达的第几个命令
\$ :提示字符,如果是root用户,提示符为 # ,普通用户则为 $
4.5 shell 特殊符号
*匹配任意内容
?匹配任意一个内容
[] 匹配中括号中的一个字符
#注释字符
\ 脱义字符
| 管道符
4.5.1 \ 脱义字符:在交互模式下的escape 字元,有几个作用;放在指令前,有取消 aliases的作用;放在特殊符号前,则该特殊符号的作用消失;放在指令的最末端,表示指令连接下一行。
[localhost@root /]$a=1
[localhost@root /]$b=$a
[localhost@root /]$echo b
b
[localhost@root /]$echo $b
1
[localhost@root /]$echo \$b //脱义一下,$就不起作用了,不能调出变量1
$b
5. cut 分割,-d分隔符 -f 指定段号 -c 指定第几个字符
[localhost@root /]$cat 1.txt |cut -d ":" -f 1 //将第一段截取出来
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
operator
games
ftp
6. sort 排序,-n 以数字排序 -r 反序 -t 分隔符 -kn1/-kn1,n2
[localhost@root /]$sort -n -t ":" -k1 1.txt
0l23$%
adm:x:3:4:adm:/var/adm:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
halt:x:7:0:halt:/sbin:/sbin/halt
knightlai:x:1000:1000::/home/knightlai:/bin/bash
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
7. wc -l 统计行数 -m 统计字符数 -w 统计词
7.1扩展实例:统计系统中有多少用户:
[localhost@root /]$wc -l /etc/passwd
21 /etc/passwd
8. uniq 去重 -c 统计行数
[localhost@root /]$uniq -c 1.txt
1 root:x:0:0:root:/root:/bin/bash
1 bin:x:1:1:bin:/bin:/sbin/nologin
1 chrony:x:998:996::/var/lib/chrony:/sbin/nologin
1 knightlai:x:1000:1000::/home/knightlai:/bin/bash
1 user1:x:1001:1001::/home/user1:/bin/bash
1 24234kjsdlfjsd
1 0l23$%
2 s
1 r
1 q
1 y
1 w
1 v
9.tr 替换字符,tr 'a''b',大小写替换tr '[a-z]' '[A-Z]'
[localhost@root /]$echo 'aaa34bbssa' | tr 'a' 'A'
AAA34bbssA
10.split 切割,-b 大小(默认单位字节),-l行数
[localhost@root sysconfig]$split -b 50 anaconda
[localhost@root sysconfig]$ll
total 108
-rw-r--r--. 1 root root 230 Jul 19 09:14 anaconda
-rw-r--r--. 1 root root 50 Aug 3 22:59 xaa
-rw-r--r--. 1 root root 50 Aug 3 22:59 xab
-rw-r--r--. 1 root root 50 Aug 3 22:59 xac
-rw-r--r--. 1 root root 50 Aug 3 22:59 xad
-rw-r--r--. 1 root root 30 Aug 3 22:59 xae
4.0K xaa
4.0K xab
4.0K xac
4.0K xad
4.0K xae
扩展知识: || 和 &&,|和& 区别
& 表示任务在后台执行,如要在后台运行redis-server,则有 redis-server &
&& 表示前一条命令执行成功时,才执行后一条命令 ,如 echo '1‘ && echo '2'
| 表示管道,上一条命令的输出,作为下一条命令参数,如 echo 'yes' | wc -l
|| 表示上一条命令执行失败后,才执行下一条命令,如 cat nofile || echo "fail"