1、使用grep -v "^#" 来去掉注释行,其中:-v 就是取相反的 ^# 表示以#开头的行
eg. grep -v "^#" /etc/vsftpd/vsftpd.conf (也可以使用“>”来重写配置文件)
2、有时也会连同空行一起去掉,使用管道符来完成(^$表示空行 )
eg. grep -v "^#" httpd.conf | grep -v "^$" >> vsftpd.conf
上面用了 2次 grep 过滤命令 ,也就是把空行和注解行过滤掉,再把剩下的内容追加保存为原
来的配置文件 vsftpd.conf 这个时候就文件里的内容就没有注解行和空行了,,,,
3、备注:在更改配置文件时,建议先对配置文件做一下备份,对配置文件不熟悉的建议不要用这种方法,配置文件中的注解行还是有一定的帮助的。
cp -a httpd.conf httpd.conf.bak
4、shell储备知识:
^一行的开始 ^d以开头的 ^..1 第三个为1的字符 ^字符要放在匹配的字符前面
$一行的末尾 ^$ 表示空行 ^.$匹配一行一个字符的 $字符要放在匹配的字符后面
*匹配任意个字符 包括0个字符 .表示单个字符
\可以屏蔽一个特殊的字符 \*\.pas 这里的*是特殊字符,这样就表示*.pas这个文件
逗号可以分割不同的匹配字符如[S,s]表示S或者s都可以
-表示一个范围,[1-9],[a-z],[A-Z] [1-9 A-Z a-z]任意的字符或者数字
A\{2\}B 表示A出现了2次 AAB
A\{4,\}B 表示A至少出现4次 AAAAB,AAAAAB
A\{2,4\}B 表示A出现2-4次 AAB AAAB AAAAB
[0-9]\{3\}\.[0-9]\{3\}\.[0-9]\{3\}\.[0-9]\{3\} 0-999.0-999.0-999.0-999
cat server.conf |grep -v "^[#,;]" |grep -v "^$"
七、shell变量
变量命名规则
- 变量名必须以字母或下划线打头,名字中间只能由字母、数字和下划线组成
- 变量名在有效范围内必须是唯一的
- 变量的分类
用户自定义变量
环境变量:主要保存的是和系统操作环境相关的数据。变量可以自定义,但是对系统生效的环境变量名和变量作用是固定的。
位置参数变量:主要是用来向脚本当中传递参数或数据的,变量名不能自定义,变量作用是固定的。
1、用户自定义变量
定义变量
变量名=变量值
例如:x=5
例如:name="yuan ke"
变量的调用
echo $变量名
例如:echo $x
例如:echo $name
[root@localhost ~]# x=5
[root@localhost ~]# name="yuan ke"
[root@localhost ~]# echo $name
yuan ke
[root@localhost ~]# echo $x
5
变量的叠加
x=123
x="$x"456
[root@localhost ~]# x=123
[root@localhost ~]# echo $x
123
[root@localhost ~]# x="$x"456
[root@localhost ~]# echo $x
123456
变量的查看
set 查看系统下所有已经生效的变量,包括系统的环境变量和用户自定义变量。
-u 选项 执行 set -u 命令以后,如果调用没有声明的变量时会报错。
[root@localhost ~]# set | less
name='yuan ke'
x=123456[root@localhost ~]# echo $a ······没有给s设置变量,没有任何提示
[root@localhost ~]# set -u ······执行命令后
[root@localhost ~]# echo $a
-bash: a: 未绑定变量 ······系统会提示没有绑定变量
变量删除
unset 变量名
[root@localhost ~]# unset name
[root@localhost ~]# set | name
-bash: name: 未找到命令
2、环境变量
source 命令
source 环境变量配置文件名 或者 . 环境变量配置文件名
# 修改配置文件后,必须注销重新登录才能生效,使用source 命令可以不用重新登录
环境变量配置文件
PATH、HISTSIZE、PS1、HOSTNAME等环境变量写入对应的环境变量配置文件
环境变量配置文件中主要是定义对系统操作环境生效的系统默认的环境变量,如PATH等。
/etc/profile 用户环境变量,交互登录才执行
/etc/bashrc 用户不用登录,执行shell就生效
/etc/profile.d/*.sh
~/.bash_profile
~/.bashrc
~/.bash_history
~/.bash_logout 用户退出后需要做的一些操作
在/etc/目录下的配置文件会对所有用户生效,放在家目录的配置文件,只会对当前用户生效。
PS1=[\u@\h \W]$
修改用户 主机名 家目录等信息
[root@localhost ~]# PS1='[\u@\h \w]\$'
[root@localhost ~]#cd data/
[root@localhost ~/data]#
[root@localhost ~/data]#PS1='<\u@\h \W>\$'
<root@localhost data>#
shell 特殊符号
*匹配任意内容
?匹配任意一个内容
[] 匹配中括号中的一个字符
#注释字符
\ 脱义字符
| 管道符
\ 脱义字符
[root@localhost ~]#a=1
[root@localhost ~]#b=2
[root@localhost ~]#c=$a$b
[root@localhost ~]#echo $c
12
[root@localhost ~]#c='$a$b'
[root@localhost ~]#echo $c
$a$b
[root@localhost ~]#c=$a$b
[root@localhost ~]#c=\$a\$b
[root@localhost ~]#echo $c
$a$b
和管道有关的命令
cut 分割,-d分隔符 -f 指定段号 -c 指定第几个字符
[root@localhost ~]#cat /etc/passwd | head -2
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
[root@localhost ~]#cat /etc/passwd | head -2 | cut -d ":" -f 1
root
bin
[root@localhost ~]#cat /etc/passwd | head -2 | cut -d ":" -f 1,2
root:x
bin:x
[root@localhost ~]#cat /etc/passwd | head -2 | cut -d ":" -f 1-3
root:x:0
bin:x:1
sort 排序,-n 以数字排序 -r 反序 -t 分隔符 -kn1/-kn1,n2
[root@localhost ~]#sort /etc/passwd
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
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
nginx:x:997:995:Nginx web server:/var/lib/nginx:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
polkitd:x:999:997:User for polkitd:/:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
root:x:0:0:root:/root:/bin/bash
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin[root@localhost ~]#sort 1.txt
<
>
,
[
]
\
111
.123
222
333
aaa
adm:x:3:4:adm:/var/adm:/sbin/nologin
bbb
bin:x:1:1:bin:/bin:/sbin/nologin
ccc
daemon:x:2:2:daemon:/sbin:/sbin/nologin
halt:x:7:0:halt:/sbin:/sbin/halt
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
root:x:0:0:root:/root:/bin/bash
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
sync:x:5:0:sync:/sbin:/bin/sync
以数字的顺序排序
[root@localhost ~]#sort -n 1.txt
<
>
,
[
]
\
aaa
adm:x:3:4:adm:/var/adm:/sbin/nologin
bbb
bin:x:1:1:bin:/bin:/sbin/nologin
ccc
daemon:x:2:2:daemon:/sbin:/sbin/nologin
halt:x:7:0:halt:/sbin:/sbin/halt
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
root:x:0:0:root:/root:/bin/bash
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
sync:x:5:0:sync:/sbin:/bin/sync
.123
111
222
333
# 需要注意的是按数字顺序排序的时候数字前面的字母默认是0
wc -l 统计行数 -m 统计字符数 -w 统计词
[root@localhost ~]#cat /etc/passwd | wc -l
20
[root@localhost ~]#cat /etc/passwd | wc -m
908
[root@localhost ~]#cat /etc/passwd | wc -c
908
uniq 去重 -c 统计行数
[root@localhost ~]#cat 2.txt
111
222
333
123
123
aaa
bbb
ccc
ddd
abc
abc
[root@localhost ~]#sort 2.txt |uniq -c
1 111
2 123
1 222
1 333
1 aaa
2 abc
1 bbb
1 ccc
1 ddd
tee 和> 类似,重定向的同时还在屏幕上显示, -a追加
[root@localhost ~]#sort 2.txt | uniq -c | tee a.txt
1 111
2 123
1 222
1 333
1 aaa
2 abc
1 bbb
1 ccc
1 ddd
[root@localhost ~]#cat a.txt
1 111
2 123
1 222
1 333
1 aaa
2 abc
1 bbb
1 ccc
1 ddd
tr 替换字符,tr 'a''b',大小写替换tr '[a-z]' '[A-Z]'
[root@localhost ~]#echo "xuexi" | tr 'x' 'X'
XueXi
split 切割,-b 大小(默认单位字节),-l行数
特殊符号
$ 变量前缀,!$组合,正则里面表示行尾
;多条命令写到一行,用分号分割
~用户家目录,后面正则表达式表示匹配符
&放到命令后面 会把命令丢到后台
#> >> 2> 2>> &>
[]指定字符中的一个,[0-9],[a-zA-Z],[abc]
|| 和 &&,用于命令之间
[root@localhost ~]#ls 1.txt ; wc -l 2.txt
1.txt
11 2.txt
|| 表示或,如果第一条命令执行正确,第二条命令则不执行。如果第一条命令执行错误,则执行第二条命令。
[root@localhost ~]#ls 123.txt || wc -l 2.txt
ls: 无法访问123.txt: 没有那个文件或目录
11 2.txt
[root@localhost ~]#ls 1.txt || wc -l 2.txt
1.txt
&& 如果第一条命令执行成功了才执行第二条命令,如果第一条命令错误,第二条命令则不执行。
[root@localhost ~]#ls 1.txt && wc -l 2.txt
1.txt
11 2.txt
[root@localhost ~]#ls 123.txt && wc -l 2.txt
ls: 无法访问123.txt: 没有那个文件或目录