查看原文
其他

Linux文件与目录管理(6)

Cloud研习社 Cloud研习社 2023-06-06

前面我们介绍到了文件与目录操作的15个常用命令。本节再学习五个常用的操作命令,学习完20个常用操作以后,下一次推文我们开始学习Linux文件属性。本节内容较多且难度大,请慢慢体会、学习。


locate


locate用来查找文件,和whereis一样,也是通过数据库查找。
语法格式:
locate 文件名
实例演示:
例1:搜索/etc/目录下所有以cr开头的文件:
[root@studyclub ~]# locate /etc/cr

例2:查找/usr/lib下所有以kd开头的文件
[root@studyclub ~]# locate /usr/lib/kd

课后练习:
  • 查找nginx.conf文件

grep



grep用来搜索相应内容并把它打印出来。这个命令可以配合正则表达式使用,这也是grep最常用、最能发挥其价值的用法。
grep命令的选项很多,但有一点要注意,搜索内容尽量用双引号引起来。
下面我们来进行详细了解grep的使用。
语法格式:
grep [OPTION] 需要搜索的内容 [FILE]
例如:在main.c中搜索hello world字符串
grep -i 'hello world' main.c

常用参数:
选项
作用


-i
搜索时,忽略大小写
-c
只输出匹配行的数量
-s
不显示没有匹配文本的错误信息
-n
列出匹配的行并列出行号
-h
查询多文件时不显示文件名
-l
只列出匹配的内容所在文件的文件名
-r
递归搜索,即如果当前目录文件没有,会自动搜索子目录的文件
-w
匹配整个单词,不做模糊匹配
-v
显示不包含搜索内容的部分
-E
加上这个选项,后面的匹配模式就会变成扩展的正则表达式
-x
整行匹配
-o
只显示匹配内容,而不是显示匹配内容所在的行
-B  n
输出满足条件的前n行
-A  n
与上面的-B类似,输出满足条件的后n行
实例演示:
实例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。
下面我就实战讲解一下grep的用法:
我们先来准备一个用来操作的文件:

[root@studyclub jason]# man find > findhelp.txt

实例4:查找特定的字符串

grep -n "tree" findhelp.txt

实例5:查找包含有re?t这种类似结构的内容

grep -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

实例6:我们再来看看行首、行尾匹配的问题
查找以NAME开头的行:

[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

实例7:匹配任意一个或任意多个字符
前面我们讲过:
.    匹配任意一个字符
*    匹配前面的字符任意次,包括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

实例8:至少匹配一个字符

[root@studyclub jason]# egrep "fe+d" findhelp.txt# +号的作用就是把前面的字符至少匹配一次

实例9:匹配0个或一个字符

[root@studyclub jason]# egrep "fe?d" findhelp.txt

实例10:匹配前面字符最少一次,最多3次

[root@studyclub jason]# egrep "fe{1,3}d" findhelp.txt

实例11:按分组匹配

[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讲),我们用到的特殊字符及其使用场景、使用方法。
    • 把上文中提到的没有做实例的选项练习一次,有个印象,提到的选项和实例,请认真熟练掌握。

管道命令


管道命令的作用就是把前一个命令的标准输出传递到后面,作为后面命令的标准输入。格式为:

命令1 | 命令2

我们以上面学到的grep命令为例,查找/etc/passwd文件中,以/sbin/nologin结尾的行(这种行对应的用户不能登录系统),最后统计有多少个这种不允许登录的用户(一条命令搞定)。
提示:统计文本行数的命令是:wc -l

[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

查看Linux系统非root用户的登录信息:

[root@studyclub ~]# last | grep -v root


df


disk free。用来查看系统上可使用的磁盘空间。默认显示单位为KB,可以加上-h参数来自动的进行单位适配,方便查阅。
语法格式:df [参数] [指定文件]
常用参数:
  • -h 以方便阅读的方式显示容量情况
  • -t 显示某个文件系统所在磁盘的容量情况
下面我来看看怎么使用:
查看磁盘分区使用情况:

[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)单位保持一致
  • Use%:已使用容量占总容量的百分比
  • mounted on:该分区(设备)的挂载点,即该分区(设备)的访问入口。

free



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秒显示一次内存的使用情况,显示结果的单位自动换成方便人类阅读的形式。
接下来,我们看看输出内容到底是什么。
  • Mem行:代表内存的使用情况
  • Swap行:代表交换空间的使用情况
  • total列:显示系统总的可用物理内存和交换空间大小。
  • used:显示已经被使用的物理内存和交换空间
  • free:显示还有多少物理内存和交换空间可用使用
  • shared:显示被共享使用的物理内存大小
  • buff/cache:显示被 buffer 和 cache 使用的物理内存大小
  • available:显示还可以被应用程序使用的物理内存大小
我们对这里面的几个概念做一下理解:free与available,buffer与cache
我们先来看buffer与cache:网上有各种资料解释buffer和cache,但是大部分人看完还是不明白其中的区别,在这里我们不做过多的解释,请记住两句话就好:
  • buffer和cache都是做缓存用的;
  • buffer作为写缓冲区,cache作为读缓存区,总之就是前者是用来写,后者用来读。
下面看看free与available:
在 free 命令的输出中,有一个 free 列,同时还有一个 available 列。这二者到底有何区别?
free 是真正尚未被使用的物理内存数量。至于 available 比较难理解,它是从应用程序的角度看到的可用内存数量。Linux 内核为了提升磁盘操作的性能,会消耗一部分内存去缓存磁盘数据,就是我们介绍的 buffer 和 cache。所以对于内核来说,buffer 和 cache 都属于已经被使用的内存。当应用程序需要内存时,如果没有足够的 free 内存可以用,内核就会从 buffer 和 cache 中回收内存来满足应用程序的请求。所以从应用程序的角度来说,available = free + buffer/cache。请注意,这只是一个很理想的计算方式,实际中的数据往往有较大的误差,属于正常现象。

《Linux基础及进阶》:004 - Linux文件与目录管理(1)005 - Linux文件与目录管理(2)006 - Linux文件与目录管理(3)007 - Linux文件与目录管理(4)008 - Linux文件与目录管理(5)

看完本文有收获?请分享给更多人

推荐关注「Cloud研习社」,带你从零开始掌握云计算技术!

微信号|bjdream-1


Cloud研习社 · 

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存