前面我们介绍到了文件与目录操作的15个常用命令。本节再学习五个常用的操作命令,学习完20个常用操作以后,下一次推文我们开始学习Linux文件属性。本节内容较多且难度大,请慢慢体会、学习。
locate用来查找文件,和whereis一样,也是通过数据库查找。
[root@studyclub ~]# locate /etc/cr[root@studyclub ~]# locate /usr/lib/kdgrep用来搜索相应内容并把它打印出来。这个命令可以配合正则表达式使用,这也是grep最常用、最能发挥其价值的用法。grep命令的选项很多,但有一点要注意,搜索内容尽量用双引号引起来。grep [OPTION] 需要搜索的内容 [FILE]
例如:在main.c中搜索hello world字符串grep -i 'hello world' main.c
|
|
| |
| |
| |
| |
| |
| |
| 递归搜索,即如果当前目录文件没有,会自动搜索子目录的文件 |
| |
| |
| 加上这个选项,后面的匹配模式就会变成扩展的正则表达式 |
| |
| |
| |
| |
实例1:查找config文件中包含有dis的单词并打印出来:思考:我们意图查找含有dis的单词,为什么第三行modification这个单词会被标记出来?实例2:在当前目录下,搜索所有文件、子目录下的文件,查找disabled含有disabled字样的文件并输出含有disabled字样的那一行。小结:通过上面两个例子我们可以看到,grep可以分析一行的数据,查找到关键字就会把包含关键字的这一行显示出来。
实例3:反向查找。这里我们找个工作中实际的场景来讲解:反向查找,我们是需要把不符合条件的内容显示出来。在实际工作中,我们会经常查看某些软件的配置文件,但是大部分情况下配置文件都很长,这里面还有很多空行和注释,为了更好的查看配置文件实际起到作用的配置项,我们在查看时,有必要过滤到配置注释行,但是配置项都是根据系统需求来做的,没有固定的可以搜索的模式,但是注释是固定的,都是以#号开头,这时候就用到了反向查找:[root@studyclub jason]# grep -v ^# config# 显示所有不以#号开头的行
SELINUX=disabled
SELINUXTYPE=targeted实例3这个案例中,我们用到了grep支持的正则表达式,接下来,我们就来看看,grep里的正则表达式有哪些符号。什么是正则表达式,简单说就是定义的一组规则和方法,用来处理字符串。这些规则里其实就包含一大批特殊的符合,比如上面的^号。
^ 行首
$ 行尾
^pattern$ 匹配整行
^$ 匹配空行
* 匹配前面的字符任意次,包括0次
. 匹配任意一个字符
.* 匹配任意长度的字符
? 匹配前面的字符0次或1次
+ 匹配前面的字符至少1次
[] 匹配括号内的任意单个字符
[^] 匹配不包含括号内的单个字符的字符
{n} 匹配前面的字符n次
{m,n} 匹配前面的字符至少m次至多n次
{,n} 匹配前面的字符最多n次
{n,} 匹配前面的字符最少n次
() 分组
在linux里,有正则表达式和扩展的正则表达式,为了方便新手学习者记忆,作者建议使用的时候直接使用正则表达式,即使用正则表达式的时候直接使用grep -E。[root@studyclub jason]# man find > findhelp.txtgrep -n "tree" findhelp.txtgrep -n "re[cs]t" findhelp.txt根据上面的例子我们可以看到,rect和rest字样的查找到了,这就是[]内不论有多少字符,grep只匹配其中一个即可。
那么如果只想查看匹配的re?t前面不想有i的单词应该怎么办?grep -n "[^i]re[cs]t" findhelp.txt这就是我们前面提到的匹配不包含括号内的单个字符的字符[^]。
再来一个场景:现在指向查找以re?t 开头的单词,而不是包含re?t 的所有单词。[root@studyclub jason]# grep -n "[^a-zA-Z0-9]re[cs]t" findhelp.txt
178: tory's link count, it knows that the rest of the entries in the directory are non-directories (`leaf' files in the directory tree). If only[root@studyclub jason]# grep -n "^NAME" findhelp.txt
5:NAME[root@studyclub jason]# grep -n "^[A-Z]" findhelp.txt[root@studyclub jason]# grep -n "^[^A-Za-z]" findhelp.txt小结:注意到了吧,那个^符号在括号内和括号外是不同的,在[]内是不包含的意思,在[]括号外是行首的意思。[root@studyclub jason]# grep -n ".$" findhelp.txt咦~,我不是要查找以点号“.”结尾的行吗,怎么都列出来了?仔细观察,我们发现grep标注特殊颜色的都是行尾最后一个字符,这是因为,点号“.”有特殊的意义,点号“.”代表任意一个字符。所以,为了查找我们想要的点号,需要把点号的特殊意义屏蔽掉,那就是使用反斜杠 \ 作为转义字符,去掉特殊符号的意义,回归符号本身。所以,上面的例子需要改成如下方式完成:[root@studyclub jason]# grep -n "\.$" findhelp.txt好了,行首和行尾就讲解到这吧,可以自行找一些例子演练一下。思考一下:如果我们想去掉文件中的空白行后显示整个文件应该怎么做?[root@studyclub jason]# grep -v "^$" findhelp.txt. 匹配任意一个字符
* 匹配前面的字符任意次,包括0次# 查找开头是r结尾是t,中间有两个字母的内容
[root@studyclub jason]# grep "r..t" findhelp.txt我们可以看到,root、print等类似字样的内容都找到了,support这种rt字样的就没有列出来。现在,如果我想把rr字样的列出来,rrr、rrrr字样的也列出来,至少有两个r的这种内容我都列出来,该怎么做:[root@studyclub jason]# grep "rrr*" findhelp.txt上面这个就是匹配前面r字符0次或多次,所以rrr*就是至少匹配到rr。如果我们用前面的知识来过滤文件中的空行和以#开头的行,做法是:[root@studyclub jason]# grep -v "^$" /etc/selinux/config | grep -v "^#"[root@studyclub jason]# egrep -v "^$|^#" /etc/selinux/config这里面的竖线“|”就相当于or的意思,egrep的效果就相当于grep -E,为了简写,就写成egrep(这样理解即可,具体实现作者也没有考证)。[root@studyclub jason]# echo fed >> findhelp.txt
[root@studyclub jason]# echo feed >> findhelp.txt
[root@studyclub jason]# echo feeed >> findhelp.txt
[root@studyclub jason]# echo feeeed >> findhelp.txt[root@studyclub jason]# egrep "fe+d" findhelp.txt# +号的作用就是把前面的字符至少匹配一次[root@studyclub jason]# egrep "fe?d" findhelp.txt[root@studyclub jason]# egrep "fe{1,3}d" findhelp.txt[root@studyclub jason]# egrep "f(e|eeee|)d" findhelp.txt好了,grep的用法就分享到这里。grep的用法还有很多,我们在后面的学习中会慢慢的接触到。作为初学者,这些内容已经可以满足工作需求了。请多加练习,重点掌握- 使用grep:查看/etc/selinux/config文件的内容,要求不显示空行和以#开头的行
- 查看/proc/cpuinfo文件中以m开头的行(m不区分大小写)
- 查看/etc/sysconfig/network-scripts/ifcfg-ens33文件中以ens33结尾的行。(ens33在不同的系统中显示为不同的名字,请根据/etc/sysconfig/network-scripts/ifcfg-xxx的xxx部分确定)
- 查看/etc/sysconfig/network-scripts/ifcfg-ens33文件中含有点分十进制ip地址的行
- 截止到目前为止(1-23讲),我们用到的特殊字符及其使用场景、使用方法。
- 把上文中提到的没有做实例的选项练习一次,有个印象,提到的选项和实例,请认真熟练掌握。
管道命令的作用就是把前一个命令的标准输出传递到后面,作为后面命令的标准输入。格式为:我们以上面学到的grep命令为例,查找/etc/passwd文件中,以/sbin/nologin结尾的行(这种行对应的用户不能登录系统),最后统计有多少个这种不允许登录的用户(一条命令搞定)。[root@studyclub ~]# grep "/sbin/nologin" /etc/passwd | wc -l
21看了吧,在grep命令和wc命令之间加一个“|”,就可以实现把grep查找的结果的文本转交给wc -l处理。我们知道/etc目录下有很多的文件和目录,ls查看的话一屏是无法都显示出来的,根据我们前面的学习,在内容特别多我们想翻页看的话可以通过more或less命令实现,那么我们来看怎么处理:方法1:
ls /etc | less
方法2:
ls /etc | more在实际工作中,管理员都会用脚本对默认用户设置默认密码,但是设置密码的交互部分比较麻烦,所以我们可以通过免交互方式设置密码,例如,我们把jason用户的密码设置为111111:[root@studyclub ~]# echo "111111" | passwd --stdin jason
Changing password for user jason.
passwd: all authentication tokens updated successfully.查看Linux系统最近的用户登录信息,仅显示root用户的登录信息:[root@studyclub ~]# last | grep root[root@studyclub ~]# last | grep -v rootdisk free。用来查看系统上可使用的磁盘空间。默认显示单位为KB,可以加上-h参数来自动的进行单位适配,方便查阅。[root@studyclub zhuo]# df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda3 18765824 1517124 17248700 9% /
devtmpfs 487096 0 487096 0% /dev
tmpfs 497944 0 497944 0% /dev/shm
tmpfs 497944 7840 490104 2% /run
tmpfs 497944 0 497944 0% /sys/fs/cgroup
/dev/sda1 191140 106244 84896 56% /boot
tmpfs 99592 0 99592 0% /run/user/[root@studyclub ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 18G 1.5G 17G 9% /
devtmpfs 476M 0 476M 0% /dev
tmpfs 487M 0 487M 0% /dev/shm
tmpfs 487M 14M 473M 3% /run
tmpfs 487M 0 487M 0% /sys/fs/cgroup
/dev/sda1 187M 104M 83M 56% /boot
tmpfs 98M 0 98M 0% /run/user/0[root@studyclub zhuo]# df -h .
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 18G 1.5G 17G 9% /[root@studyclub zhuo]# df -t xfs
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda3 18765824 1517124 17248700 9% /
/dev/sda1 191140 106244 84896 56% /boot上面我们可以看到,df无论怎么怎么执行,都会输出六列内容:- Filesystem:列出文件系统所在的分区,所以我们看到的都是分区(设备名)
- 1K-blocks:代表下面的数字以KB为单位。这一列名称会随着df参数的变化发生变化,除了1K-blocks,还会出现size、1M-blocks。出现size的时候在下面会显示单位,以1M-blocks出现的时候,下面的数字的单位为MB.
- Used:已使用容量,容量单位和上一列的size列(1k-blocks)单位保持一致
- Available:可用容量,容量单位和的size列(1k-blocks)单位保持一致
- mounted on:该分区(设备)的挂载点,即该分区(设备)的访问入口。
free命令用来查看系统的内存使用情况,包括物理内存、swap、内核缓冲区[root@studyclub ~]# free# 输出结果以KB为单位
total used free shared buff/cache available
Mem: 995892 104536 686908 14076 204448 697492
Swap: 1999868 0 1999868
[root@studyclub ~]# free -h# 输出结果根据实际情况自动转换单位,方便人类阅读
total used free shared buff/cache available
Mem: 972M 102M 670M 13M 199M 681M
Swap: 1.9G 0B 1.9G
[root@studyclub ~]# free -k# 指定显示结果以KB为单位
total used free shared buff/cache available
Mem: 995892 104540 686884 14076 204468 697480
Swap: 1999868 0 1999868
[root@studyclub ~]# free -m# 指定显示结果以MB为单位
total used free shared buff/cache available
Mem: 972 102 670 13 199 681
Swap: 1952 0 1952如果我们想持续不断的查看内存的使用情况怎么办?free有个-s选项,就是让你持续监测用的:[root@studyclub ~]# free -h -s 5上面这条命令的意思就是每5秒显示一次内存的使用情况,显示结果的单位自动换成方便人类阅读的形式。- total列:显示系统总的可用物理内存和交换空间大小。
- buff/cache:显示被 buffer 和 cache 使用的物理内存大小
- available:显示还可以被应用程序使用的物理内存大小
我们对这里面的几个概念做一下理解:free与available,buffer与cache我们先来看buffer与cache:网上有各种资料解释buffer和cache,但是大部分人看完还是不明白其中的区别,在这里我们不做过多的解释,请记住两句话就好:- buffer作为写缓冲区,cache作为读缓存区,总之就是前者是用来写,后者用来读。
在 free 命令的输出中,有一个 free 列,同时还有一个 available 列。这二者到底有何区别?free 是真正尚未被使用的物理内存数量。至于 available 比较难理解,它是从应用程序的角度看到的可用内存数量。Linux 内核为了提升磁盘操作的性能,会消耗一部分内存去缓存磁盘数据,就是我们介绍的 buffer 和 cache。所以对于内核来说,buffer 和 cache 都属于已经被使用的内存。当应用程序需要内存时,如果没有足够的 free 内存可以用,内核就会从 buffer 和 cache 中回收内存来满足应用程序的请求。所以从应用程序的角度来说,available = free + buffer/cache。请注意,这只是一个很理想的计算方式,实际中的数据往往有较大的误差,属于正常现象。推荐关注「Cloud研习社」,带你从零开始掌握云计算技术!