Centos7学习笔记(三)——重定向、通配符、正则
1、STDIN、STDOUT、STDERR
输入重定向和输出重定向的符号和作用,分别在下面2个表中。


注意:当输出结果是error时,是不能将结果重定向到“标准输出”中,反之,输出结果是“标准输出”,也不能重定向至错误输出中。如下图实例:

[study@nfs01 ~]$sudo echo "00 1 * * * /usr/bin/rsync -avz -r /etc/rc.d rsync_nfs01@172.16.1.41::nfs01/ --password-file=/tmp/rsync_passwd &>>/dev/null" >>/etc/crontab -bash: /etc/crontab: 权限不够
出现此问题的原因是,echo作为root专用命令,虽然通过sudo转为root用户去执行了,但是由于又执行了>>重定向,相当于执行了2个命令,后面所跟的文件,并没有获取到sudo权限转root执行。解决方法:
1.将echo和>>作为一条命令执行
利用 "sh -c" 命令,它可以让 bash 将一个字串作为完整的命令来执行,>这样就可以将 sudo 的影响范围扩展到整条命令。具体用法如下:$ sudo sh -c 'echo "又一行信息" >> test.asc'
2.使用sudo可以触达到的命令
利用管道和 tee 命令,该命令可以从标准输入中读入信息并将其写入标准输出或文件中,具体用法如下:$ echo "第三条信息" | sudo tee -a test.asc
[study@nfs01 ~]$sudo sh -c 'echo "00 1 * * * /usr/bin/rsync -avz -r /etc/rc.d rsync_nfs01@172.16.1.41::nfs01/ --password-file=/tmp/rsync_passwd &>>/dev/null" >>/etc/crontab' [sudo] study 的密码: [study@nfs01 ~]$cat /etc/crontab 00 1 * * * /usr/bin/rsync -avz -r /etc/rc.d rsync_nfs01@172.16.1.41::nfs01/ --password-file=/tmp/rsync_passwd &>>/dev/null
2、硬链接和软连接以及文件删除原理
ls输出结果中,文件名是存储在其所在目录对应的block里。文件的inode存储了文件的属性(大小、时间、所有者、权限等)信息
什么是硬链接?具有相同inode节点号的文件,互为硬链接。目录被创建,硬链接天然为2,比如,test/和test/.就互为硬链接。
目录的硬链接数=2+目录下所拥有的目录数量(每个目录都有..指向上级目录)
[root@studylinux ~/data1]#mkdir test{1..5}
[root@studylinux ~/data1]#cd ..
[root@studylinux ~]#ls -lirt
total 672
33582915 -rw-------. 1 root root 1591 Jul 26 22:44 anaconda-ks.cfg
34155498 -rw-r--r--. 1 root root 670293 Aug 3 20:17 services
34155488 -rw-r--r--. 1 root root 8134 Aug 3 20:21 lsman.txt
34155499 -rw-r--r--. 1 root root 1591 Aug 3 22:11 anaconda.txt
37008 drwxr-xr-x. 7 root root 84 Aug 7 19:49 data1
[root@studylinux ~]#ls -dli data1/ data1/. data1/test{1..5}/..
37008 drwxr-xr-x. 7 root root 84 Aug 7 19:49 data1/
37008 drwxr-xr-x. 7 root root 84 Aug 7 19:49 data1/.
37008 drwxr-xr-x. 7 root root 84 Aug 7 19:49 data1/test1/..
37008 drwxr-xr-x. 7 root root 84 Aug 7 19:49 data1/test2/..
37008 drwxr-xr-x. 7 root root 84 Aug 7 19:49 data1/test3/..
37008 drwxr-xr-x. 7 root root 84 Aug 7 19:49 data1/test4/..
37008 drwxr-xr-x. 7 root root 84 Aug 7 19:49 data1/test5/..
什么是软链接?
软链接本质就是快捷方式,是指向源文件的文件,自身拥有inode,是和源文件不同的文件,自身没有block。
[root@studylinux ~/data1]#ls -li
total 4
37009 -rw-r--r--. 1 root root 158 Aug 2 10:22 hosts
[root@studylinux ~/data1]#ln -s hosts hosts_soft_link
[root@studylinux ~/data1]#ls -li
total 4
37009 -rw-r--r--. 1 root root 158 Aug 2 10:22 hosts
37091 lrwxrwxrwx. 1 root root 5 Aug 7 20:17 hosts_soft_link -> hosts
文件删除的原理:
1、静态文件(没有进程或者程序正在访问的文件)
所有硬链接数被置为0,即所有硬链接都被干掉,包括自身。
硬链接的数量的代表变量符号为i_link
当rm -f test.txt test_hard_link执行时,其实文件没删(inode和block还在),以下情况后,文件无法找回。
a)系统定时清理掉了没有文件名的inode。
b) 手动或者自动磁盘检查了。
c) 在新增了文件后,系统优先使用没有文件名的inode。
恢复的工具:debugfs,ext3grep等。
2、动态文件(有进程或者程序访问的文件)
删除原理:
a。所有硬链接删除。i_link为0.
b。i_count是进程调用文件的数量(引用计数)。所有进程调用终止,i_count为0。
3、通配符与特殊符号
通配符适用范围:普通命令或者脚本
1)第一组:模糊匹配
a、*
b、?
c、[]——中括号中放字符集,匹配中括号中的任意一个字符
d、[a-z]——匹配a-z中任意一个字符
f、[!a-f]——取反a-f的之间的任意字符,注意,仍然是1个字符。此时,!可用^取代,如[^a-f]
例题:
x ~/data1]#find /etc/ -type f -name "?[opq][^a-r]ts" /etc/hosts [root@studylinux ~/data1]#find /etc/ -type f -name "*[^a-r]ts" /etc/selinux/targeted/contexts/dbus_contexts /etc/selinux/targeted/contexts/default_contexts /etc/selinux/targeted/contexts/files/file_contexts /etc/selinux/targeted/contexts/lxc_contexts /etc/selinux/targeted/contexts/sepgsql_contexts /etc/selinux/targeted/contexts/snapperd_contexts /etc/selinux/targeted/contexts/systemd_contexts /etc/selinux/targeted/contexts/x_contexts /etc/selinux/targeted/active/file_contexts /etc/hosts
2)第二组:路径与位置
~ . .. -
3)第三组:引号相关
a、''——单引号,所见即所得
b、""——双引号,可用解析变量
c、``——反引号,用于解析命令,它等价于 $()
4)第四组:其他字符
a、;——命令分隔符
b、#——管理员提示符或者注释符号
c、$——普通用户提示符或者变量调用
d、|——管道符号
e、\——转义符
f、{}——1、生成序列;2、引用变量,变量成为一个整体
g、!——取反,vim中是强制
h、&&——并且,等同于and,前者执行正确,后者才执行
i、||——或者,等同于or,前者执行错误,后者才输出
5)重定向
4、正则表达式(又学)
什么是正则表达式?它是为了处理大量字符串及文本而定义的一套规则和方法。
特点:
1、为处理大量文本及字符串而定义的一套规则和方法。
2、其工作时以“行”为单位进行,即一次处理一行。
3、通过正则表达式可以将复杂的处理任务化繁为简,提高操作linux的效率。
4、仅被grep、sed、awk、perl等命令使用,其他命令无法使用。
基本正则(basic regular express)
^——以...开头,

$——以...结尾
ls -lF|grep "/$" 查找/etc下的所有目录
^$——空行

.——匹配任意一个字符且只有一个字符,和shell命令行中的?一样,但不匹配空行
这里,匹配“i”和“i(任意字符)”,后者比如是ia、in、is等等等等。
\——转义符

*——在正则中,它表示重复任意多次(0次也包括)前面的字符
这里,匹配的是“”、“0”、“00”、“000”、“0000”等等,可以是空(0的0次匹配)也可以是无限个0。

这里,匹配的是“0”、“0(任意字符)”、“0(任意字符)(任意字符)”、“0(任意字符)(任意字符)(任意字符)”等等等等,后者“任意字符”可以无限次。
这里
.*——匹配任意字符
^.*——匹配任意字符开头
.*$——匹配任意字符结尾
[abcd]——匹配方括号集合中的任意一个字符,字符如果是连续的,可以写成[a-d]

[^abc]——匹配不包括^后的任意字符a或b或c

扩展正则(extend regular express)
+——匹配前一个字符1次或者多次,跟基本正则里的*对应
这里,跟“.*”的区别就是,“.*”匹配空行(即0次),“.+”不匹配空行,必须有至少1个字符。
注意:这里有一个常用的 [:/]+ 表示匹配:或者/一次或者多次
?——匹配前一个字符0次或1次
这里,可以匹配数字“0”0次或者1次,当为0次时,其他任意字符也匹配,所以匹配了全文内容。
|——表示或者(or),同时过滤多字符串用

{n}——匹配大括号前一个字符n次(等于n次)
这里,匹配数字“0”5次。
{n,m}——匹配大括号前一个字符最少n次,最多m次


{n,}——匹配大括号前一个字符最少n次

{,m}——匹配大括号前一个字符最多m次
()——圆括号内的字符串做为一个整体
\n——反向取值,可以有\1、\2等多次,但取决于前面“()”整体有多少次

ifconfig eth0 |sed -rn '2s#^.*inet (.*) net.*$#\1#gp'
匹配IP地址的正则写法:
其一:^(([0-9]\.)|([1-9][0-9]\.)|(1[0-9][0-9]\.)|(2[0-4][0-9]\.)|(25[0-5]\.)){3}(([0-9]\.)|([1-9][0-9]\.)|(1[0-9][0-9]\.)|(2[0-4][0-9]\.)|(25[0-5]\.))$
其二:((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.){3}(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])
其三:^((2(5[0-5]|[0-4]\d))|[0-1]?\d{1,2})(\.((2(5[0-5]|[0-4]\d))|[0-1]?\d{1,2})){3}$

