Centos7学习笔记(三)——重定向、通配符、正则

1、STDIN、STDOUT、STDERR

输入重定向和输出重定向的符号和作用,分别在下面2个表中。

image.png

image.png

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

image.png[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)

^——以...开头,

image.png

$——以...结尾

image.png    ls -lF|grep "/$"  查找/etc下的所有目录

^$——空行

image.png

.——匹配任意一个字符且只有一个字符,和shell命令行中的?一样,但不匹配空行

image.png            这里,匹配“i”和“i(任意字符)”,后者比如是ia、in、is等等等等。

\——转义符

image.png

*——在正则中,它表示重复任意多次(0次也包括)前面的字符

image.png       

这里,匹配的是“”、“0”、“00”、“000”、“0000”等等,可以是空(0的0次匹配)也可以是无限个0。

image.png

这里,匹配的是“0”、“0(任意字符)”、“0(任意字符)(任意字符)”、“0(任意字符)(任意字符)(任意字符)”等等等等,后者“任意字符”可以无限次。

image.png  这里

.*——匹配任意字符

^.*——匹配任意字符开头 

.*$——匹配任意字符结尾

[abcd]——匹配方括号集合中的任意一个字符,字符如果是连续的,可以写成[a-d]

image.png

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

image.png

扩展正则(extend regular express)

+——匹配前一个字符1次或者多次,跟基本正则里的*对应

image.png      这里,跟“.*”的区别就是,“.*”匹配空行(即0次),“.+”不匹配空行,必须有至少1个字符。

注意:这里有一个常用的 [:/]+  表示匹配:或者/一次或者多次

?——匹配前一个字符0次或1次

image.png    这里,可以匹配数字“0”0次或者1次,当为0次时,其他任意字符也匹配,所以匹配了全文内容。

|——表示或者(or),同时过滤多字符串用

image.png

{n}——匹配大括号前一个字符n次(等于n次)

image.png 这里,匹配数字“0”5次。

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

image.png

image.png

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

image.png

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

()——圆括号内的字符串做为一个整体

\n——反向取值,可以有\1、\2等多次,但取决于前面“()”整体有多少次

image.png

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}$

// 查看全文
2020 8月 04

Centos7学习笔记(二)-基础命令(二)

 

3、Linux基础命令

1、date

参数:

-s  设置日期

-d  display time described by STRING, not 'now'---用日期表示法的完整字符串(比如“1day”,“2month”,“1year”)来显示时间,但不准用“now”。

实例如下:

 

[root@ecs-ryCz8 /home/study]# date +%F -d "now"
2020-08-05
[root@ecs-ryCz8 /home/study]# date +%F -d "day"
2020-08-06
[root@ecs-ryCz8 /home/study]# date +%F -d "dat"
date: invalid date ‘dat’
[root@ecs-ryCz8 /home/study]# date +%F -d "-37month"
2017-07-05
[root@ecs-ryCz8 /home/study]# date +%F -d "+10week"
2020-10-14
[root@ecs-ryCz8 /home/study]# date +%T -d "+7hour"
17:48:39
[root@ecs-ryCz8 /home/study]# date +%T -d "-20year"
10:49:14
[root@ecs-ryCz8 /home/study]# date +%j -d "-6Sunday"
date: invalid date ‘-6Sunday’
[root@ecs-ryCz8 /home/study]# date +%j -d "-6minute"
218
[root@ecs-ryCz8 /home/study]# date +%j
218

 

日期表示部分写法如下:

年-月-日 “%Y-%m-%d”等同写法“%F”

时-分-秒  “%H-%M-%S”

时:分:秒 “%H:%M:%S” 等同于“%T”

“    %D”等同于“%m/%d/%y” 7/30/20这样的写法

“%j”表示一年中的第几天

“%u”表示一周中的第几天(1-7),1表示Monday星期一

“%w”也表示一周中的第几天(0-6),0表示Sunday星期天

2、pidof

pidof 命令用于查询某个指定服务进程的PID 值,格式为“pidof [参数] [服务名称]”

 

3、uptime 命令

uptime 用于查看系统的负载信息,格式为uptime。它是top命令的第一行显示。

uptime 命令真的很棒,它可以显示当前系统时间、系统已运行时间、启用终端数量以及平均负载值等信息。平均负载值指的是系统在最近1 分钟、5 分钟、15 分钟内的压力情况(下面加粗的信息部分);负载值越低越好,尽量不要长期超过1,在生产环境中不要超过5。

对比:(同一台机器所截图)

top:

image.png

uptime:

image.png

4、free命令

常用参数:

-h 以人类易读方式

-m 以MB方式显示,比如下面的

[root@studylinux ~]#free 
              total        used        free      shared  buff/cache   available
Mem:        4026140      215216     3683276       11856      127648     3620564
Swap:       2097148           0     2097148
[root@studylinux ~]#free -m
              total        used        free      shared  buff/cache   available
Mem:           3931         210        3596          11         124        3535
Swap:          2047           0        2047

先看截图,可与上述top对比

image.png

对应含义:        内存总量         已用量          空闲量   远程共享的内存量   磁盘缓存的内存量    可用量

 

5、wc命令

用于文本信息统计。统计文本的行数、字数、字节数。格式为“wc  [参数] 文本”

最常用的参数三个:

-l——只显示行数

-w——只显示单词数

-c——只显示字节数

 

6、cut命令

cut 命令用于按“列”提取文本字符,格式为“cut [参数] 文本”

在 Linux 系统中,如何准确地提取出最想要的数据,这也是我们应该重点学习的内容。一般而言,按基于“行”的方式来提取数据是比较简单的,只需要设置好要搜索的关键词即可。但是如果按列搜索,不仅要使用-f 参数来设置需要看的列数,还需要使用-d 参数来设置间隔符号。passwd 在保存用户数据信息时,用户信息的每一项值之间是采用冒号来间隔的,接下来我们使用下述命令尝试提取出passwd 文件中的用户名信息,即提取以冒号(:)为间隔符号的第一列内容:

[root@linuxprobe ~]# head -n 2 /etc/passwd

root:x:0:0:root:/root:/bin/bash

bin:x:1:1:bin:/bin:/sbin/nologin

[root@linuxprobe ~]# cut -d: -f1 /etc/passwd

root

bin

daemon

adm

.......

 

7、dd

convert and copy a file     转换和拷贝一个文件

Copy a file, converting and formatting according to the operands    拷贝一个文件,根据运算域转换和格式化。

最常用命令用法:dd  [if=标准输入源]   [of=标准输出目标]  [count=n]   [bs=m]

详细参考:https://www.cnblogs.com/ginvip/p/6370836.html

 

8、partprobe

命令用法:partprobe [ 参数]

-s 显示设备和它的分区的摘要

命令作用:将分区表的改变,更新到内核。

 

9、fsck

仅用于修复ext类型文件系统。等同于e2fsck。

参数:-a   自动修复

xfs_repair的修复方法:1、先umount;2、xfs_repair -n做xfs系统检查;3、最好先xfs_metadump保持元数据。4、xfs_repair /dev/sdb;5、xfs_check /dev/sdb检查修复状况;

-L是修复xfs文件系统的最后手段,慎重选择,它会清空日志,会丢失用户数据和文件。\

 

10、xargs

作为一个容易被忽略的命令,它本身的作用是将标准输入转换为命令行的参数。默认的,它是以echo去输出的。

常用的参数,比如:-n,它指定每次以多少项,作为后面命令的参数。典型的例子如下:

#echo {0..9} | xargs -n 2 echo0 12 34 56 78 9

这里有一篇文章,对xargs命令算是全面的解释。http://www.ruanyifeng.com/blog/2019/08/xargs-tutorial.html

工作中用到的例子:

磁盘要满了,首先要搞清系统每个目录用了多少磁盘空间

ls /|sed -nr 's#(.*)#\/\1#gp'|xargs du -sh

 

11、crontab

-e 进入编辑模式

-l 仅列表查看

-u 查看特定用户下的定时任务

crontab格式

*                           *                                *                          *                                    *                              命令或者脚本(绝对路径)

分钟(0-59)   小时(0-23)            天(0-31)             月(1-12)                每周哪天(0-7,周日0或7)

 

12、set

bash内置命令,作用:可以列出系统当前定义的大部分变量。

set -u 可以用于检查变量是否已经定义。

 

13、env

用于输出当前部分环境变量。

set和env,都能输出环境变量,但是,都不是全部的环境变量。

两者,都可以输出“SSH_CLIENT”和“SSH_CONNECTION”的值。

 

14、ps

参数:

a——显示一个终端的所有进程,除了会话引线

u——显示进程的归属用户和内存使用情况

x——显示没有控制终端的进程

15、pstree

进程树方式显示

参数:-p 显示进程的PID

-u 显示进程的所属用户

 

16、kill

用于杀死进程,用法:kill [信号]  PID

关于所有的“信号”,可以用 kill -l来列举查看。其中,常用的就是信号1和信号9,信号1是杀死进程后,进程重新读取配置文件重启。类似于restart。信号9,就是彻底杀死进程。

其中,信号1也可以写做HUP。类似下面

kill -HUP httpd

kill -1 httpd

kill -9 httpd

 

17、killall

killall用来终止某个指定名称的服务所对应的全部进程。格式为“kallall [参数][信号] 进程名称”。通用kill命令的写法,信号部分当然也一样的。

比如:

image.png

常用参数:

-i,交互式确认

-I,忽略进程名称的大小写

 

18、pkill

pkill跟killall类似,也是按照进程名称来杀死进程。用法格式为“pkill [参数] [信号] 进程名称”

关于pkill的参数,可以man查看。

其中特殊的一个参数-t,可以用于杀死指定登录的终端。比如:

pkill -9 -t pts/0

 

19、jobs、bg、fg

jobs显示后台工作进程,首序列是工作号,用数字顺序标识。

jobs参数: 

-l显示后台工作进程的PID。

bg让后台工作的进程恢复在后台执行。用法:bg %工作号

fg让后台工作的进程恢复到前台执行。用法:fg %工作号

 

20、nohup

将程序置于后台执行,其执行脱离终端(当前终端)的限制。以上bg、fg、jobs都是只对当前终端有效。

 

21、logrotate

logrotate软件包特有命令,日志轮替用。具体软件使用见官方文档。

常用参数:

-v 显示日志轮替过程。

-f(force)强制进行日志轮替。即使轮替发生的条件不符合,也按照配置文件(默认/etc/logrotate.conf)中配置轮替所有日志文件。

命令用法:logrorate [参数]  配置文件

// 查看全文
2020 8月 03