Linux入门笔记(二)

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_45320930/article/details/96975123

一、Linux系统管理

1.系统基础管理和维护

1.1 Tab:补全。

Tab一次,输入的内容能够唯一标识,直接跳出命令(补全);
          输入的内容不能够唯一标识,再Tab,显示出所有匹配的命令。
Tab命令补全的原理:vi,系统根据环境变量$PATH去文件下寻找命令

(echo  $PATH:系统环境变量的路径全部打出来了)

1.2 shell命令操作——快捷键

(shell是一种脚本语言)
mkdir :创建目录
touch :创建文件
cat:查看文件
Ctrl+a: 光标跳到最前面
Ctrl+e: 光标跳到最后面
Ctrl+k: 光标移到中间,按键删除光标及其后的内容
Ctrl+u: 光标移到中间,按键删除光标前面的内容
Ctrl+l: 清屏
Ctrl +r: 寻找历史命令(想再次看网卡内容)
Ctrl+c: 停止当前正在运行的程序
ping +IP地址:测试网络连通性

1.3 vi / vim操作 :用于编辑文本

在这里插入图片描述

1.4历史命令

history:查看历史命令

!+历史命令的列表行数:直接执行该行的命令(!10:执行第十行的历史命令)

!$ :执行最后一次的历史命令

help history ;查看帮助

history -w:把历史命令列表同步到历史命令文件中
history -c:清空历史命令

echo $HISTFILE:查看历史命令文件位置
(echo:输出打印到屏幕上)

       -c:清空history list。可以用 -r 选项再读回来。
       -d:删除指定的命令历史
       -a:将新增的history追加到history file。
       -n: read all history lines not already read from the history file
       -r:从history file读取命令并追加到history list。
       -w:将当前的history写入history file。

如何设置 历史命令的保存数量

echo $HISTSIZE :查看history(历史命令文件)可保留的历史命令的条数

vim /etc/profile:进入/profile文件中

HISTSIZE=1000:表示只能保存1000行命令,剩余不被保存

source /etc/profile:重新加载,更新profile文件内容
在这里插入图片描述
表示历史文件最多存1000条历史命令。

如何设置历史命令的时间戳,和使用用户

vim /etc/profile:进入/profile文件中,更改历史命令的行数,然后进行 source

在最后一行编辑:

export HISTTIMEFORMAT="%F %T `whoami`(空格)"

:wq:保存退出

source /etc/profile:更新profile文件内容
在这里插入图片描述

1.5 别名alias

定义别名:

[root@localhost ~]# alias net="vi /etc/sysconfig/network-scripts/ifcfg-eth0"

取消别名:

[root@localhost ~]# unalias net

跳过别名:(\称为转义符)

[root@localhost ~]# \net

让别名永久生效:

编辑bashrc文件:

[root@localhost ~]# vim /etc/bashrc

下最后一行编辑输入:

alias net="vim /etc/sysconfig/network-scripts/ifcfg-eth0"

:wq

[root@localhost ~]#source /etc/bashrc

在这里插入图片描述

当“\”+命令:跳过命令

1.6 定义变量

变量分为环境变量、本地变量和局部变量。
本地变量:针对当前shell进程中的某代码片段,通常指函数。

局部变量:针对当前shell进程;对当前shell之外的其它shell进程,包括当前shell的子shell进程均无效。

环境(全局)变量:针对于当前的shell下的所有进程及子进程都生效。

(1)环境(全局)变量:
在这里插入图片描述
步骤:

vi test.sh:编辑test.sh文件(.sh是脚本文件)

sh test.sh:执行test.sh文件

(2)
在这里插入图片描述
定义变量:

[root@localhost test1]# a="qqqq"

查看:

[root@localhost test1]# echo $a

取消变量:

[root@localhost test1]# unset a

[root@localhost test1]# a=name #当前shell进程,子进程。

[root@localhost test1]# echo $SHELL

1.7 输入,输出

0:标准输入
1:标准输出
2:错误输出
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

">"覆盖
“>>”追加

“>”+文件名:标准输出到文件

[root@localhost ~]# ls >file1		// 将ls输出的结果输入到file1文件中

“2”>+错误文件的文件名:错误输出到文件

[root@localhost ~]# mysql 2> err

“>”+文件名 2> errname :将标准输出到filename文件,错误输出到errname

[root@localhost ~]# ll anaconda-ks.cfg anaconda-ks1.cfg > ceu 2>err

[root@localhost ~]# ll anaconda-ks.cfg anaconda-ks1.cfg &>file4

[root@localhost ~]# ll anaconda-ks.cfg anaconda-ks1.cfg >file5 2>&1

输出结果不显示在屏幕上:

/dev/null
在这里插入图片描述

标准输入到文件file3:

在这里插入图片描述
标准输出和错误输出都放在同一文件中:(两种方法)

(1)
在这里插入图片描述
(2)
在这里插入图片描述

标准输出和错误输出都放在不同文件中:
在这里插入图片描述

扩展:

(1)

$?:判断上一条命令执行是否成功。若成功,返回0;若失败,返回非零。
在这里插入图片描述
在这里插入图片描述
(2)

判断网络是否连通:
在这里插入图片描述
(3)扩展:

脚本
在这里插入图片描述
在这里插入图片描述

1.8特殊符号,通配符

(1)管道符“|”:把上个命令的执行结果交给了下一个命令继续处理

a、
        (通过管道符|将ll的执行结果,通过grep,过滤掉不是以err开头的结果,也就是说通过管道符|,用grep查找ll中以err开头的文件)
在这里插入图片描述
表示将LL中以err开头的文件过滤出来。

b、
在这里插入图片描述
c、

“tee”:把过滤的结果打印到文件中
在这里插入图片描述
在这里插入图片描述
(2)

mkdir 创建目录

touch创建文件夹

ll:列出结果详细

ls:当前目录下有哪些文件,只列出文件名或目录名

“…” :表示上一级目录
在这里插入图片描述

“.” :表示当前目录
在这里插入图片描述
“;” :表示多条命令的分割
在这里插入图片描述

【 ` 】:反撇号,把内容还原成命令
在这里插入图片描述
在这里插入图片描述
“ * ” :匹配所有。

        将LL中所有已te开头的文件夹显示出来:
在这里插入图片描述
“ ? ” :匹配单个任意字符:
在这里插入图片描述
{ }:表示扩展

[root@localhost ~]# mkdir -p {a,b/c}
[root@localhost ~]# ls
a                err      file2  file6     tes    test10  test6
anaconda-ks.cfg  errlog   file3  net       test   test2   time.sh
b                err.log  file4  ping.log  TEST   test3
ceu              file1    file5  ping.sh   test1  test4
[root@localhost ~]# cd b
[root@localhost b]# ls
c

eg:​		/tmp/mylinux
​					├── bin
​					├── etc
​					|	├──sysconfig
​					|		├──network-scripts
​					|			├──ifcfg-eth0
​					├── dev
​					|	├──sda
​					├── usr
​						├──local
​							├──lib
​							├──lib64
		
		mkdir -p /tmp/mylinux/{bin,etc/sysconfig/network-scripts/ifcfg-eth0,dev/sda,usr/local/{lib,lib64}}

匹配数字:

[root@localhost ~]# ll test[0-9] [0-9](尖括号间没空格)
[root@localhost ~]# ll test[[:digit:]]*(匹配所有数字)

匹配字母

【a-b] 匹配小写字母;【A-Z】和【【:alpha:】】 匹配所有字母

【】匹配括号内匹配到的内容

【^】:表示非的意思,
在这里插入图片描述

shell中单引号和双引号的区别:

‘ ’:(单引号)强引用,所见即所得(引号内输入什么,它就直接输出什么)

“ ”:(双引号)弱引用,输出引号内所有内容;若其中含有命令(要反引)、变量、特殊转义,会先把变量、命令、转移字符解析出来,然后在输出结果。
\t => tab ;
\n => 换行

反引号:一般用于命令,执行的时候命令会被执行,相当于 $() ,赋值和输出都要用反引号引起来。

[root@localhost ~]# time="我们都是\n好孩子"
[root@localhost ~]# echo -e $time
我们都是
好孩子

[root@localhost ~]# time='我们都是\n好孩子'
[root@localhost ~]# echo -e $time
我们都是
好孩子

//echo -e:表示转意,不受强引或弱引约束
[root@localhost ~]# time="现在是北京时间:`date`"
[root@localhost ~]# echo $time
现在是北京时间:2019年 08月 01日 星期四 08:24:25 CST
      //双引号转变命令`date`后在输出内容

[root@localhost ~]# time='现在是北京时间:`date`'
[root@localhost ~]# echo $time
现在是北京时间:`date`
      //单引号原样输出内容

2.系统管理的常用命令

ls命令

ls - -help:查找帮助

ls -a :显示所有的隐藏文件及目录

ls -A :只显示隐藏文件

ls -l 等同于 ll:ll:列出结果详细

ls :显示的是链接文件及链接路径,

ls -L :显示的是链接路径下的真实文件

在这里插入图片描述
       当前位置在var下,用 ll 命令看,他有一个spool文件,spool文件下有一个mail文件,给mail文件做了一个快捷模式,链接到var下。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.相对路径,绝对路径,pwd

(1)pwd

pwd:显示当前路径

pwd -P:显示链接文件的真实路径

在这里插入图片描述

(2)路径

在这里插入图片描述

用绝对路径,表示index.html ;/root/test/app/index.html

用相对路径,表示index.html ;app/index.html

(3)cd指令

cd - :切换到上一次文件所在的路径

cd ~ :切换到用户的家目录

cd …/ :切换到上层目录

cd …/…/ :切换到上上层目录
在这里插入图片描述
在这里插入图片描述

(4)date

格式:date	"+命令"

date -s :修改系统时间

%H : 小时(00-23)
%I : 小时(01-12)
%M : 分钟(00-59)
%S : 秒(00-60)
%r : 直接显示时间 (12 小时制)
%T : 直接显示时间 (24 小时制)
%X : = %H:%M:%S (eg: 06:00:41 PM)
date +%Z:时区

date +%Y :年份(全称)
%b : 月份 (Jan-Dec)
%B : 月份 (January-December)
%d : 日 (01-31)

%a : 星期几 (Sun-Sat)
%A : 星期几 (Sunday-Saturday)
%x : 直接显示日期
%c : 直接显示日期与时间
%D : 直接显示日期

时钟显示格式的拼接:明确每个参数含义

在这里插入图片描述

修改系统时间:
在这里插入图片描述
显示时区:
在这里插入图片描述
【扩展:】
在这里插入图片描述

#!/bin/bash

time=`date "+%H"`

echo $time

reboot:重启系统

[root@localhost ~]# yum install wget

(5)wget

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

[root@localhost ~]# yum install wget
Index of /centos/7.6.1810/extras/x86_64/Packages/

[root@localhost ~]# wget http://mirrors.sohu.com/centos/7.6.1810/extras/x86_64/Packages/centos-release-scl-2-3.el7.centos.noarch.rpm

[root@localhost src]# wget -b -c http://mirrors.sohu.com/centos/7.6.1810/extras/x86_64/Packages/ansible-2.4.2.0-2.el7.noarch.rpm /usr/local/src/

[root@localhost src]# wget -P /usr/local/src/ http://mirrors.sohu.com/centos/7.6.1810/extras/x86_64/Packages/ansible-2.4.2.0-2.el7.noarch.rpm

-b :后台运行

-P :指定下载路径

-c :断点续传

(6)uname , free

uname -s:内核名称
uname -r:内核发行版本
uname -v:内核版本
uname -n:节点名,指参数-n会提供给你节点的主机名
uname -a:查看系统内核全部信息

cat /etc/redhat-release:查看系统版本

[root@localhost ~]# uname -r
2.6.32-642.el6.x86_64
//  2:主版本号
	6:次版本号
	32:对次版本的修订次数或者补丁包数
	642:编译的次数
	el6:版本的特殊信息,el  表示企业版Linux
	x86_64:表示64位

(7)free

free -h :查看内存使用情况(带单位)
free -m :查看内存使用情况(不带单位)
在这里插入图片描述

men:内存

swap:在磁盘是格式化的一个和内存格式相同的分区

buff:数据读的缓存空间

cache : 数据写的缓存空间

(7)系统管理命令

uptime:查看CPU利用率

       当前系统时间,服务状态,运行时间长,多少个用户,5分钟平均负载;10分钟平均负载;15分钟的平均负载。

[root@localhost ~]# uptime
 12:37:39 up  1:58,  2 users,  load average: 0.00, 0.01, 0.05

top:实时显示系统负载,以及每一个进程的资源占用情况
在这里插入图片描述
在这里插入图片描述

ps : 查看进程

在这里插入图片描述
ps -ef 查看进程

ps -aux |grep ssh(ssh:远程连接)

-A:所有的进程均显示出来,与 -e 具有同样的效用

-a :当前终端的进程

-u:用户的进程

-ax :显示详细信息

(8)用户命令

passwd:更改密码
在这里插入图片描述

[root@localhost ~]# whoami
root

[root@localhost ~]# who -m
root     pts/0        2019-07-25 16:41 (192.168.134.100)

passwd:修改当前用户密码

passwd 用户名:修改用户密码

su:切换用户
su 用户名:用户目录没有变化

su - 用户名:到用户的家目录

[root@localhost ~]# su test
[test@localhost root]$ whoami
test

切换到家目录:

[root@localhost ~]# su - test

exit:退出当前用户

​ (回到上一次所使用的用户名):

[test@localhost ~]$ exit

who - m:查看用户

whoami:查看当前用户

(9)文件操作

1. 创建文件或目录:

**mkdir** 目录:只能创建一层目录

mkdir -p 目录1/目录2/目录3…:创建多层目录

[root@localhost ~]# mkdir -p data/data2/data3

touch:创建文件

“>”文件名:创建文件

[root@localhost ~]# touch data/1/2/file3
    //在data目录下的 1目录下的 2目录下创建file3文件

[root@localhost ~]# >file2
    //创建file3文件

2. 查看文件:

cat:查看文件

cat file1 file2:把两个文件的内容拼接在一起

cat -n 文件:打印行号

cat -s 文件:删去文件内容中的多行空行

cat -E 文件:在行末加上$符号

vi + 行号:光标直接跳到对应的行

[root@localhost data]# cat -n passwd			//打印行号

[root@localhost data]# vim +21 passwd			//光标直接跳到第21行
[root@localhost data]# cat file1
linux

[root@localhost data]# cat file2
windows

[root@localhost data]# cat file1 file2
linux
windows

在这里插入图片描述
diff 文件1 文件2 :查看文件间区别:

[root@localhost data]# diff file1 file2

head:查看文件内容前几行(默认是10行)

[root@localhost data]# head -40  passwd			//查看passwd文件前40行

tail:查看文结尾(默认是10行)

[root@localhost data]# tail -20 passwd			//查看passwd文件的后20行

more:分屏显示

[root@localhost log]# more -10 dmesg.old			
      //设置一屏十行

Ctrl+F:向下分屏滚动

Ctrl+B:向上分屏滚动

3. grep文件:过滤文件内容

[root@localhost data]# grep root passwd			//过滤在passwd文件中的root。
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

grep ^ 文件:在文件中以^后的字母开头的行

[root@localhost data]# grep ^root passwd		//在passwd文件中,以root开头的行。
root:x:0:0:root:/root:/bin/bash

grep -i :不区分大小写

grep -c 文件 文件所在路径:统计打印的行数

grep -n 文件 文件所在路径:打印文件行号

grep -v 文件 文件所在路径:取反

[root@localhost data]# grep -i root passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

[root@localhost ~]# grep -c root /etc/passwd
2
	//将/etc/passwd下,有出现root的行数统计出来

[root@localhost ~]# grep -n root /etc/passwd
1:root:x:0:0:root:/root:/bin/bash
10:operator:x:11:0:operator:/root:/sbin/nologin
	//将/etc/passwd下,有出现root的行取出来,并显示内容对应的行号
[root@localhost log]# ip a |grep inet
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host
    inet 192.168.134.112/24 brd 192.168.134.255 scope global ens33
    inet6 fe80::5343:1737:e497:16dd/64 scope link

[root@localhost log]# ip a |grep inet |grep -v inet6
    inet 127.0.0.1/8 scope host lo
    inet 192.168.134.112/24 brd 192.168.134.255 scope global ens33

4. rm:删除文件

rm 文件名 :删除文件

rm 删除目录 -r:递归删除

rm -r :递归删除一个目录

rm -f :强制删除

rm -d :删除空目录

[root@localhost ~]# rm -r data
rm: descend into directory `data'? y
rm: remove directory `data/data1'? y
rm: remove regular file `data/file2'? y
rm: remove regular file `data/file1'? y
rm: descend into directory `data/1'? y
rm: descend into directory `data/1/2'? y
rm: remove regular file `data/1/2/file3'? y
rm: remove directory `data/1/2'? y
rm: remove directory `data/1'? y
rm: remove regular file `data/passwd'? y
rm: descend into directory `data/data2'? y
rm: remove directory `data/data2/data3'? y
rm: remove directory `data/data2'? y
rm: remove directory `data'? y
     //递归删除一个目录

rm的工作原理:存在三个file文件
在这里插入图片描述
i_count:存储管理;i_link:链接管理
    图片表示刚开始创建三个文件:file1,file2,file3和一个文本文档,它们都连接指向一个inode_1(但系统中不止这一个inode,这里只以这一个为例),inode_1用于连接硬盘,从硬盘中的某一对应区域读取数据,(此时 i_count=4,i_link=3,硬盘内存为(10,10))。然后删除三个文件夹,此时 i_count=3,i_link=0,硬盘内存为(0,20)。

5. mv:移动文件位置

(移动的时候,如果不指定新名字,名字不变;指定则重命名)

(mv 文件1 文件2:将文件2移动到文件1下)

6. cp:复制文件

(cp 要复制的文件名 要复制的位置 )

cp -p:带权限复制

cp -a :复制所有

7. file:查看文件类型

(file 文件名)

[root@localhost ~]# file cp_test
cp_test: empty			//cp_test 文件为空

在这里插入图片描述
ln file1 file2:给 file1创建了一个硬链接

ln -s file1 file3:创建软链接。

       软连接在源文件file1删除的情况下,失效,但自己(file3)依旧存在;
       硬链接在源文件file1删除后,内容依然存在。
在这里插入图片描述
    注:file3是软链接,而删除后再新建的file1不再是file3的源文件,只是同名而已,新建的file1指向自己的inode(inode用于连接硬盘,从中读取数据),所以file3跟着新的file1一起指向新的inode,则file3中原来存储的内容全部没了;但file2文件中的内容不会随着file1的删除和重建而丢失。

8. find:查找路径,

find :查找路径,(默认当前) 参数(-name 文件名, -user ,-type f/s:查找文件)
在这里插入图片描述
(按照权限查找)

[root@localhost test10]# find / -name passwd
/sys/fs/selinux/class/passwd
/sys/fs/selinux/class/passwd/perms/passwd
/etc/passwd
/etc/pam.d/passwd
/usr/bin/passwd

[root@localhost test10]# find /etc/  -name passwd
/etc/passwd
/etc/pam.d/passwd

在这里插入图片描述
    注:一终端含义n个用户在使用主机,将多个用户分一组,组名命名为test1…,用户名为use1…,该段时间内只有属组test1下的属主use1可以使用该文件。

exec:对匹配的文件执行该参数所给出的shell命令。

形式为:command {} ;

注意{}与;之间有空格

[root@localhost test]# find -name test99 -exec rm -rf{} \;
//查找并删除

[root@localhost test]# find -name "test*" -exec rm -rf {} \;		//查找所有以test开头的文件并删除它们

Windows系统分盘,而Linux系统不分盘,它只含有一个根/目录,在/根目录下挂载各个文件。

​    /根目录结构:FHS

Linux系统文件目录:

文件系统:类Unix系统,是一个 “倒挂树” 的形式

​ bin、sbin:系统命令的二进制文件

​ boot:存放与系统启动有关的文件

​ dev:系统设备文件

​ etc:配置文件

​ home:用户家目录

​ lib:库、模块的文件

​ opt:第三方的安装模块

​ usr:系统用户

​ var:与应用相关的文件

[root@localhost /]# ls
bin   dev  home  lib64  mnt  proc  run   srv  tmp  var
boot  etc  lib   media  opt  root  sbin  sys  usr

1. 文件操作:

cut:截取

cut -b:按照字节个数来截取文件

cut -b 10-20 ://截取第10到20字节的文件内容

cut -b 10- ://截取第10字节以后的内容

cut -b -20 ://截取第20字节以前的内容

[root@localhost log]# ip a |grep inet |grep -v inet6 |cut -b 10-24
127.0.0.1/8 sco
192.168.134.112

sort:排序

默认是正序排列(sort -n:也是正序)

sort -r :倒序

cat sort |wc -l:统计行数

[root@localhost test]# cat sort |sort -r
6
5
4
3
2
1
[root@localhost test]# cat sort |sort |uniq
1
2
3
4
6
9
//先排序,再去重

2. 查询命令路径:

**which **:查看命令所在路径;

​ ===》可以判断系统有没有安装该命令

[root@localhost test]# which sort
/usr/bin/sort

whereis:查看命令所在路径(包括文件包名)

[root@localhost test]# whereis pwd
pwd: /usr/bin/pwd /usr/share/man/man1/pwd.1.gz

3. 查询文件所在位置:

find:(见上文)

locate:查找符合条件的文档

4、文件搜素工具:

grep:文本搜索引擎

grep +选项+文件名, egrep, fgrep

选项:-i:忽略大小写

  ​  ​  ​  ​  ​-v:取反

 ​  ​  ​  ​  ​ -n:显示行

[root@localhost dev]# alias
alias cp='cp -i'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias mv='mv -i'
alias net='vi /etc/sysconfig/network-scripts/ifcfg-ens33'
alias rm='rm -i'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
//查找别名

4.1 基本正则表达式元字符:(四个方面)

字符匹配:

​ " . ":匹配任意单个字符

​ “ 【】”:匹配指定范围内的任意单个字符

​ “ ^”:匹配指定范围外的任意单个字符

​ 【:digit:】:数字

​ 【:alpha:】:字母

​ 【:alnum:】:数字和字母

​ 【【:digit:】】:匹配任意数字,

​ 【【:lower:】】:匹配小写字母,

​ 【【:upper:】】:匹配大写字母

[root@localhost dev]# grep r..t /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
//输出以r开头,以t结尾的单词所在行

[root@localhost dev]# grep s[abcd]i /etc/passwd
//匹配以s开头,以i结尾,中间出现abcd中任意字母的,输出其所在行

[root@localhost ~]# grep r[[:alpha:]][[:alpha:]]t /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
//匹配所有以r开头,以t结尾,中间包含两个字母的单词,并输出其所在行

[root@localhost ~]# grep r[[:alpha:]]*t /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
//匹配所有以r开头,以t结尾的单词,并输出其所在行

匹配次数:

​ * (星):匹配 * 前面字符任意次数

​ .*:匹配任意长度的任意字符

​ \?:匹配前面的字符0次或1次

​ \ *:匹配一次或者多次

​ \ {m,n\ }:匹配 其前面的字符至少 m 次,至多 n 次

​ \ {0,n\ }:匹配至多n次

​ \ {m,\ }:至少m次

[root@localhost dev]# cat file
bcdy
sy
xxxxxxxxy
asd
yan
[root@localhost dev]# grep x*y file
bcdy
sy
xxxxxxxxy
yan
//匹配出现x任意次数,并且有y的输出

[root@localhost dev]# cat file
xxxxxxy
xxx
wxxy
bcs
bdfy
x
y
xy
[root@localhost dev]# grep "x\?y" file
xxxxxxy
wxxy
bdfy
y
xy
//只有有y就能匹配出来

位置锚定:

​ ^;行首锚定

​ $:行尾锚定

​ ^$:空行

​ ^ [[:space:]]*$:空行或包括空白字符的行

​ 词首锚定:\ < 或 \b

​ 词尾锚定:\ > 或 \b

​ 匹配完整单词:\ <索要匹配的单词\ >

[root@localhost dev]# grep r..t /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

[root@localhost dev]# grep bash$ /etc/passwd
root:x:0:0:root:/root:/bin/bash
//行尾锚定,以bash单词结尾的所在行整行输出
[root@localhost dev]# grep "\<root" /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
//词首锚定

[root@localhost dev]# grep "\root\>" /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
//词尾锚定

[root@localhost dev]# grep "\<root\>" /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
//匹配完整单词

练习:

1、显示/etc/passwd中不以/bin/bash结尾的行

[root@localhost dev]# grep -v /bin/bash$ /etc/passwd

2、找出/etc/passwd中两位数(或三位数)

[root@localhost dev]# grep "\<[0-9]\{2\}\>" /etc/passwd
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
//匹配二位数

[root@localhost dev]# grep -o "\<[0-9]\{2,3\}\>" /etc/passwd
//显示二位数或三位数及其所在行

3、找出ifconfig命令中IP地址

[root@localhost dev]# ifconfig ens33 |grep inet |grep -v inet6 |cut -b 14-30
192.168.134.112

分组和引用:

\ (\ ):将一个或者多个字符捆绑在一起,当做一个整体进行处理

\(xy\)\ (zd\ )ab\1:把xy当做第一组,把zd当做第二组,取第一组

​ ​ ​ ​ ​ ​ ​ ​ ​ \1:引用第一个分组

[root@localhost dev]# grep l..e.*l..e test
he loves his lover
he likes his lover
she loves her lover
she likes her liker

[root@localhost dev]# grep "\(l..e\).*\1" test
he loves his lover
she loves her lover
she likes her liker
//匹配以 l 开头,其后出现 e 的单词作为第一组,\1 表示引用第一组,即表示结尾所匹配的单词应与第一组所匹配到的单词一样
展开阅读全文

没有更多推荐了,返回首页