linux命令整理

1.命令基础信息

Linux中大小写敏感
Linux中的目录一切从根开始
快捷键:
Ctrl + C : 终止正在运行的命令
清空屏幕快捷键:ctrl + L 或者 clear 或 reset 命令
清空当前输入快捷键:ctrl + u
或者放弃当前输入快捷键:ctrl + c #命令行提示符会跳到下一行,之前输入的错误命令仍然会保留,但没有被执行。

1.1 命令的使用格式

基础命令(ping 命令)

linux中命令的使用格式
    命令  空格  选项(非必须)  空格  操作对象
    ping  www.baidu.com

ping命令:探测远程服务是否正常运行,也可以通过ping来测试本机是否可以正常上网。
    格式:
        ping [探测的对象]
        ping www.baidu.com

1.2 命令行提示符

命令行提示符:

命令行提示符:[root@localhost ~]# ping www.baidu.com
    root        : 当前登录系统的用户
    @           : 分隔符,没有特殊意义
    localhost   :  主机名,就相当于咱们身份证上的名字
    ~           :  当前文件夹路径
    #           : 当登录的用户是超级管理员(windows:Administartor,Linux:root)
    $           :  当普通管理员登录时,显示$

更改命令提示符:

更改命令提示符:
        知识储备:
            source  :  重载文件,作用是使文件中的内容得以立即生效
            PS1     : 命令提示符的变量,也就是说PS1中存的是变量的内容(PS1 ---> [\u@\h \W]\$)
            变量    :  程序运行过程中实时改变的量
            echo    :  打印内容
            更改系统时间:date -s "2021-09-14 21:21:21"
            cd      :  切换目录(Linux中一切从根开始)
(base) [10343693@zte.intra@LIN-21C6BC57170 study_linux]$ echo $PS1
(base) [\u@\h \W]\$

[root@localhost ~]$ PS1="[\u@\h \W]\$"

        \u      : 代表当前登录的用户
        \u      : 代表当前登录的用户
        \h      : 代表当前机器的主机名,只显示一个主机名
        \H      : 代表当前机器的主机名,显示所有的主机名
        \W      : 代表当前目录的名称(注:~ 代表的当前用户的家目录{家目录:是用户登录首次出现的目录}\w      : 代表当前目录的全路径  D:\py19\Linux基础\day03\笔记

        \d      : 代表日期,格式:星期几 月份 日期
        \t      : 代表24小时制时间,格式:HH:MM:SS
        \T      : 代表12小时制时间
        \A      : 代表24小时制时间,格式:HH:MM
        \v      : 代表BASE的版本号

1.3 查看帮助信息命令

1、man

man命令的功能是查看某一条命令的详细解释。

   man shutdown : 进入查看界面
   格式:
       man [具体需要被查看的命令]
   选项
       NAME        :一句话说明被查看命令的作用
       SYNOPSIS    :展示命令的使用格式
       OPTIONS     :被查看的命令的所有选项
       DESCRIPTION :命令的简介,也就是详细的告诉我们当前这个命令具体是干什么的
   快捷键
       上下键:切换屏幕
       搜索:(注:光标最好放在第一行, 第二次定位,按n键,查找下一个)
       第一步:按 / 键
       第二步:输入搜索的内容
       第三步:回车
       第四步:按n键,查找下一个
       退出:按 q 键

2、help

   格式:
       -h
       --help
           [root@localhost ~]$ shutdown --help
       help

1.4 系统常用快捷键

上下键:
1、切换屏幕
2、根据使用命令的历史,切换命令(注:同一个命令行窗口)

清空屏幕信息:ctrl + l
与之相同的命令:clear

光标移动到行首与行尾
crtl + a(crtl + 左) : 移动到行首
crtl + e(ctrl + 右) : 移动到行尾

剪切内容至行首:crtl + u
剪切内容至行尾:crtl + k

粘贴内容:crtl + y

命令补全(必须唯一):tab

1.5 命令的别名

alias : 别名

        格式: 
            alias 字符="相关的命令"

        案例1:查看系统所有的别名
            alias

        案例2:设置一个别名
            alias lh="ls -l -h"

2.目录路径相关命令

2.1 目录路径相关命令

pwd 命令: 查看当前所在目录的路径(绝对路径)
    实际上使用的是系统环境变量中的PWD的值

printenv : 打印系统环境变量
    系统环境变量:系统默认给咱们定义的变量

cd 命令 : 切换目录
    格式:
        cd [目标路径]
        绝对路径:从根目录(通常表示为/)开始的完整路径
        相对路径:相对于当前工作目录的路径
        特殊的路径:
                .   : 代表当前目录
                ..  : 代表上级目录
                -   :代表上一次待的目录
                ~   : 代表家目录/主目录路径。例如,~/Documents表示当前用户的主目录下的Documents目录。
                /   : 根目录路径:根目录路径用斜杠(/)表示,表示文件系统的最顶层目录。例如,/var/www/html表示位于根目录下的var/www/html目录。

2.2 文件夹相关的命令

mkdir 命令:创建目录的命令

格式:
        mkdir [选项(非必须)] [被创建的目标路径]
选项(参数):
        -p : 自动创建父级目录

    1、创建单层目录
        在当前目录创建一个名为:test的文件夹
        mkdir test

    2、创建多层目录
        在/root目录下创建一个名为test01的目录
        mkdir /root/test01
        在/root目录下,创建一个/root/a/b/c目录
            [root@localhost ~]$ mkdir /root/a/
            [root@localhost ~]$ mkdir /root/a/b
            [root@localhost ~]$ mkdir /root/a/b/c

            [root@localhost ~]$ mkdir /root/aa/bb/cc
            mkdir: cannot create directory ‘/root/aa/bb/cc’: No such file or directory
            [root@localhost ~]$ mkdir -p /root/aa/bb/cc

2.3 文件目录相关命令

1、创建文件的命令 touch

touch 命令:

格式:
    touch [选项] [被创建的文件的路径]
补充:
    {} : 表示循环
    ..  : 连续
    ,   : 不连续

案例1:创建一个名为abc的文件
            touch abc
案例2:创建/root/a/abc
            touch /root/a/abc
案例3:创建 test1 ~ test100 中的所有文件
            touch test{1..100}
案例4:创建test111 ~ test199 ,并且在其每一个目录中都创建test文件
            mkdir test1{11..99}
            touch test1{11..99}/test
案例5:创建test003、test006、test009这三个目录
            touch test00{3,6,9}

2、查看数据信息命令 ls

ls 命令:
        查看指定目录下的所有的文件
        格式:
            ls [选项] [指定的路径]
            ls后默认跟的是当前文件夹的路径
            隐藏文件:Linux中以.开头的文件即为隐藏文件
        选项(参数):
            -l : 查看文件详细信息
            -a : 查看隐藏文件
            -h : 格式化显示文件大小(前提:必须跟-l参数一起使用)
            --color=auto : 显示颜色(注:不能够通过颜色判断文件属性)
补充:
            ls -l  等价于 ll :它是怎么实现的(别名)

案例1:查看当前目录里的所有文件
            [root@localhost ~]$ ls
            anaconda-ks.cfg  init.sh

案例2: 查看当前目录中文件的详细信息
            [root@localhost ~]$ ls -l
            -rw-------. 1 root root 1776 Sep 13 11:10 anaconda-ks.cfg
            -rw-r--r--. 1 root root 5632 Sep 13 12:14 init.sh

            -           :文件的属性 
            rw-r--r--.  : 文件的权限
                r : 可读
                w : 可写
                x : 可执行
                - :没有对应的权限

                权限位:
                    属主(自己)
                    属组(指定组中的所有的用户的权限)
                    其他用户
            1           : 硬链接个数
            root root   : 属主 属组
            1776        : 文件的大小(单位:字节 B)
            Sep 13 12:14 : 文件创建的时间
            init.sh         : 文件的名称

                1024 B == 1kb
                1024kb == 1MB
                1024mb == 1GB
                1024gb == 1TB
                1024tb == 1PB

 常见的文件的属性表示符
            f(FILE    -)    : 普通文件的标识符
            d(DIRECTORY)    :  普通文件夹的标识符

3、输出打印字符命令 echo

echo  : 输出
        格式:
            echo [输出的内容] [重定向字符(非必须)] [重定向的文件(非必须)]

        案例1:输出Hello World
            [root@localhost ~]$ echo "Hello Wolrd"
            Hello Wolrd
        案例2:将Hello Wolrd输出到文件2.txt中
            [root@localhost ~]$ echo "Hello Wolrd" > 2.txt
        知识储备:
            >       : 覆盖重定向(先将文件中原有的内容清空,然后写入内容到文件)
            >>      : 追加重定向(将内容写入到文件最后边,原有的内容不变)
            重定向 : 把某个内容,通过某种方式输入到指定文件中,即为重定向

4、查看文件内容 cat

cat   : 读取,打印
        格式:
            cat 选项(非必须) [读取的文件路径]
        选项:
            -n :显示行号

案例1: 读取2.txt中的内容
        [root@localhost ~]$ cat 2.txt 
        Hello Wolrd01
        Hello Wolrd02
案例2: 读取/etc/hosts文件内容,输入到3.txt中
            [root@localhost ~]$ cat /etc/hosts > 3.txt
            [root@localhost ~]$ cat 3.txt 
            127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
            ::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
案例3: 将
            127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
            ::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
            写入到4.txt中
            [root@localhost ~]$ cat > 4.txt <<EOF
            127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
            ::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
            EOF   # 一定要顶格写
            [root@localhost ~]$ cat 4.txt 
            127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
            ::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
 案例4: 要求读取4.txt中的内容,并打印行号
            [root@localhost ~]$ cat -n 4.txt 
             1  127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
             2  ::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
cat > linux_test22.txt
12 34
hello
[Ctrl+D]

5、复制内容 cp

 cp : copy的缩写
        格式: 
            cp [选项(非必须)] [原路径] [新路径]
        选项:
            -r : 递归复制目录
            -i : 增加覆盖提示
            -p : 保留原有文件的属性
            -d : 当复制符号连接时,把目标文件或目录也建立为符号连接,并指向与源文件或目录连接的原始文件或目录;
        案例1:将1.txt复制到/tmp目录
            [root@localhost ~]$ cp 1.txt /tmp/
        案例2:将/var/log目录及其目录中的所有内容全部复制到/tmp目录
            [root@localhost ~]$ cp -r /var/log /tmp/
        案例3: 仅将/var/log/messages、/var/log/boot.log、/var/log/vmware-network.log三个文件复制到/tmp/
            [root@localhost ~]$ cp /var/log/{messages,boot.log,vmware-network.log} /tmp/
        案例4: 将/etc/system-release 复制到 /tmp目录下
            [root@localhost ~]$ cp -d /etc/system-release /tmp/
        案例5: 复制2.txt到/tmp目录中,要求不更改其创建时间
            [root@localhost ~]$ cp -p 5.txt /tmp/
            知识储备:
                stat : 查看文件创建时间的

6、移动剪切 mv

mv : 将linux当中的某个文件移动到指定目录
	格式:
		mv [选项] [原来的文件路径] [现在的文件路径]
		mv命令后面既可以跟绝对路径也可以跟相对路径。
	选项:
		-i : 覆盖前提示
案例1:将1.txt移动到/tmp目录下
	mv 1.txt /tmp
案例2:将/root/2.txt 移动到 /tmp目录中
        mv /root/2.txt /tmp
案例3:将/var/log目录移动到/tmp目录中
        [root@localhost ~]$ mv /var/log/ /tmp/
案例4:将/root目录中的所有文件移动到/tmp目录中
        知识储备:
            正则表达式
                * : 代表所有的文件(匹配任意字符个数的内容)
                ?: 代表一个字符
        [root@localhost ~]$ mv /root/*  /tmp/
        注:隐藏文件默认不被移动
案例5:将/root目录下的abc1 ~ abc9 移动到/tmp目录中
第一种方式:
            [root@localhost ~]$ mv /root/abc{1..9} /tmp/
第二种方式:
            [root@localhost ~]$ touch abc{1..9}
            [root@localhost ~]$ ls
            abc1  abc2  abc3  abc4  abc5  abc6  abc7  abc8  abc9
            [root@localhost ~]$ mv /root/abc* /tmp/
            [root@localhost ~]$ ls /tmp/
            abc1  abc2  abc3  abc4  abc5  abc6  abc7  abc8  abc9
第三种方式:
            [root@localhost ~]$ touch abc{1..9}
            [root@localhost ~]$ 
            [root@localhost ~]$ ls
            abc1  abc2  abc3  abc4  abc5  abc6  abc7  abc8  abc9
            [root@localhost ~]$ mv /root/abc? /tmp/
            [root@localhost ~]$ ls
            [root@localhost ~]$ ls /tmp/
            abc1  abc2  abc3  abc4  abc5  abc6  abc7  abc8  abc9

案例6:将/root目录下的abc1 ~ abc9 移动到/tmp目录中
        [root@localhost ~]$ touch abc{1..19}
        [root@localhost ~]$ ls
        abc1  abc10  abc11  abc12  abc13  abc14  abc15  abc16  abc17  abc18  abc19  abc2  abc3  abc4  abc5  abc6  abc7  abc8  abc9
        [root@localhost ~]$ mv /root/abc? /tmp/
        [root@localhost ~]$ ls
        abc10  abc11  abc12  abc13  abc14  abc15  abc16  abc17  abc18  abc19
        [root@localhost ~]$ ls /tmp/
        abc1  abc2  abc3  abc4  abc5  abc6  abc7  abc8  abc9

案例7:将/root目录下abc1 ~ abc99 移动到/tmp目录中
        [root@localhost ~]$ mv /root/abc{?,??} /tmp/

7、删除 rm

rm : 删除文件的命令
	格式:
		rm [选项] [被删除文件的路径]
	选项:
	
		-i : 删除前提示
		-r : 递归删除
		-f : 忽略不存在的文件和参数,从不提示
案例1:将/tmp目录下所有的文件全部删除

		[root@localhost tmp]$ \rm /tmp/* 
案例2:删除/tmp目录下的test目录
		第一种情况:空目录
			rm -r test/
		第二种情况:非空目录
		如果目录不为空,即它包含子文件或子目录,使用 rm 命令不能直接删除目录,因为 rm 命令默认不删除非空目录。如果你尝试使用 rm 命令删除非空目录,会收到一个错误提示,类似于 "Directory not empty"。
为了删除非空目录,你可以使用 -r 选项来进行递归删除。
			rm -rf test/
			rm -r -f test/
案例3:删除/tmp目录下以abc开头的文件
		[root@localhost tmp]$ rm -f /tmp/abc*

linux中一切皆文件,企业中一般不允许删除文件。禁止使用rm命令:
    第一种方式: 修改别名
			[root@localhost tmp]$ alias rm="fgfbasdb"
			[root@localhost tmp]$ rm -rf /tmp/* 
			-bash: fgfbasdb: command not found
    第二种方式:将rm命令修改名字
			[xxx@localhost tmp]$ cd /usr/bin/
			[xxx@localhost bin]$ mv rm abcdefg
			mv: 无法将'rm' 移动至'abcdefg': 权限不够
			[xxx@localhost bin]$ sudo mv rm abcdefg
			mv: 无法将'rm' 移动至'abcdefg': 不允许的操作

8、查看命令的真实路径 which

which : 查看命令的真实路径
	which [具体的命令]
	案例1:查看rm命令的路径
		[root@localhost tmp]$ which rm
		alias rm='rm -i'
			/usr/bin/rm
		[root@localhost tmp]$ which ll
		alias ll='ls -l --color=auto'
        	/usr/bin/ls
whereis命令可以用来查找二进制文件、源文件以及帮助文件等信息。使用命令如下:
        whereis [选项] [文件名]
		[root@localhost tmp]$ whereis rm
                rm: /usr/bin/rm /usr/share/man/man1/rm.1.gz
find命令可以用来在文件系统中查找文件或目录。使用命令如下:
        find [起始目录] [选项] [表达式]
        find / -name “ls”

3.目录文件处理

3.1 find(查找文件)

find 命令

在linux系统中,按照我们的要求去查找文件

格式:

find 【查询的路径】【匹配模式】【匹配规则】

匹配模式:

-name : 按照名字去匹配
-type : 按照文件的类型匹配
-perm : 按照文件的权限来查询
-user : 按照文件的属主来查询
-nouser : 查询用户被删除了的文件
-group : 按照文件的属组来查询
-nogroup : 查询没有数组的文件
-mtime : 按照修改文件的时间来查询
-ctime : 按照文件的创建时间来查询
-atime : 按照访问时间来查询文件
-a(默认): 并且
-o : 或者
-exec(xargs) : 处理匹配之后的内容
正则匹配:

* : 匹配任意数量的任意字符(匹配零个或多个任意字符)
? : 匹配任意一个字符
知识储备:

删除用户: userdel

删除用户组: groupdel

stat : 查看文件的各种时间

(1.按name 2.type 3.perm 4.user 5.group 6.mtime 7.ctime 8.atime 9.size 10.exec和xargs)

1 name : 按照名字去匹配

案例1:查询出/etc目录下的hosts文件
find /etc -name "hosts"

案例2:查询出/etc目录下的以ifcfg开头的文件 
find /etc/ -name "ifcfg*"

案例3:查询出/etc目录下以.conf结尾的文件
find /etc/ -name "*.conf"

案例4:查询出/etc目录下,文件名中包含host的文件有哪些
find /etc/ -name "*host*"
2 type : 按照文件的类型匹配

常见的文件类型:
f:普通文件
d:普通文件夹
l:链接文件
c:字符设备文件
b:块设备文件
s:socket文件

案例5:查询出/etc目录下,所有的普通文件。
find /etc/ -type f

案例6:查询出/etc目录下,所有的文件夹
find /etc/ -type d

案例7:查询出/dev/目录中的所有的块设备文件
find /dev/ -type b

案例8:查询出/dev目录中所有的字符设备文件
find /dev/ -type c

案例9:查询出/etc目录中文件名包含nginx的普通文件
find /etc/ -name "*nginx*" -type f
3 perm : 按照文件的权限来查询

案例10:查询出/root目录下,权限为755的文件
find /root/ -perm 755
4 user : 按照文件的属主来查询

备注:文件主和组被删除后,留下的是主和组的id

案例11:查询出属主为test01的文件
find /root/ -user test01

案例12:查询属主被删除了的文件
find /root/ -nouser
5 group : 按照文件的属组来查询

案例13:查询属组为test02的文件
find /root/ -group test02

案例14:查询属组被删除了的文件
find /root/ -nogroup
6 mtime : 按照修改文件的时间来查询

+ 查询某个时间段之前的数据

- 查询某个时间段之内的数据

案例15:查询2天以前修改过的文件
find /root/ -mtime +2
7 ctime : 按照文件的创建时间来查询

案例16:查询2天以内创建的文件
find /root/ -ctime -2
8 atime : 按照访问时间来查询文件

案例17:查询2天以内访问过的文件
find /root/ -atime -2
9 size : 按照文件的大小来查询

+ 查询超过n的文件

- 查询小于n的文件

案例18:查询大于1M的文件
find /root/ -size +1M
案例19:查询小于1M的文件
find /root/ -size -1M
10 execxargs

查询在3天以内创建的普通文件,并删除
find /tmp/ -ctime -3 -type f -exec rm -rf {} \;
或者
find /tmp/ -ctime -2 -type f | xargs -I {} rm -rf {}
-exec : 处理查询之后的内容
{} : 代表的是查询到的内容、
\; : 固定搭配
xargs :将所有的内容格式化成一行
练习:要求将所有3天内创建的普通文件加上.bak后缀
find /tmp/ -ctime -3 -type f -exec mv {} {}.bak \;
或者
find /tmp/ -ctime -3 -type f | xargs -I {} mv {} {}.bak

3.2 grep

3.2.1 grep命令的作用和格式

grep命令一般用来筛选数据,用来筛选我们需要的数据

格式 :

grep [参数] [过滤的规则] [路径]
标准输出 | grep [参数] [过滤规则]

3.2.2 grep命令的参数

参数:
    -n : 显示过滤出来的文本在文件内的行号    
    -o : 只显示匹配到的内容
    -q : 静默输出
    -i : 忽略大小写
    -c : 显示匹配到的行数
    -v : 反向查找(重要)
    -w : 匹配某个词
    -E : 使用扩展正则
    -R : 递归查询(重要)
    -l : 只打印文件路径
扩展参数:
    -A :显示匹配到的数据的后n行
    -B :显示匹配到的数据的前n行
    -C :显示匹配到的数据的前后各n行
知识储备:
    $? : 代表上一条命令执行是否成功(0:成功,非0代表失败)
    词 : 一连串字母和数字组成的字符串
    wc -l : 打印显示有多行

3.2.3 案例

案例1:要求过滤出/etc/passwd中包含的root的行及其行号
grep -n "root" /etc/passwd

案例2:要求过滤出/etc/passwd中包含的root的行,只显示过滤到的内容
grep -o "root" /etc/passwd

案例3:要求过滤/etc/passwd中的Root,忽略大小写
grep -i 'Root' /etc/passwd

案例4:要求匹配/etc/passwd中mail及其后两行
grep -n -A 2 "mail" /etc/passwd

案例5:要求匹配/etc/passwd中mail及其前两行
grep -n -B 2 "mail" /etc/passwd

案例6:要求匹配mail及其前后各两行
grep -n -C 2 "mail" /etc/passwd

案例7:要求显示包含root的行有多少行
grep -c "root" /etc/passwd

案例8:要求查询不包含root的行
grep -v "root" /etc/passwd

案例9:匹配yang这个词
grep -w 'yang' 1.txt

案例10:要求匹配出包含yang的行
grep "yang" 1.txt
或者
grep -E "(yang)+" 1.txt

案例11:要求找出/etc目录下,那些文件中包含root
grep -R "root" /etc/
或者
grep -Rl "root" /etc/
    R:递归查询
    l:只打印文件路径

练习1:计算/etc目录下包含root的文件有多少个?
grep -Rl "root" /etc/ | wc -l

练习2:查询/etc/passwd文件中包含/bin/bash的行并输出行号
grep -n "/bin/bash" /etc/passwd

3.3 正则表达式

正则表达式是通过包含特殊含义的一些字符去适配各种匹配场景,从而匹配出我们想要的结果

1、普通正则表达式

* :匹配零个或多个前导字符
$ :以前导字符结尾
. :匹配任意一个字符(换行符除外)
^ :以前导字符开头的行
[^] :取反
.* :所有的字符的任何个数[] : 或者(其中包含的所有的字符的或者)
\ : 转义字符
[a-z] :a-z所有的一个字母
[A-Z] :A-Z所有的一个字母
[0-9] :0-9所有的一个数字

2、扩展正则表达式

(grep 必须加-E参数,或者使用 egrep 命令)

egrep 等价于 grep -E
+ : 前导字符的一个或多个
? : 前导字符的零个或一个
| : 或者(竖线两边的字符的或者)
() : 分组,组成一个整体
\n : n代表的是前面第几个分组
{m,n} : 范围,至少有m个,最多有n个
{m} : 范围,固定m个
{m,} : 范围,至少有m个

3、案例

案例1:以3结尾的行
grep "3$" 1.txt

案例2:要求输出包含eth的行
grep "eth" 2.txt

案例3:以1开头的行
grep "^1" 1.txt

案例4:要求打印出/etc/nginx/nginx.conf中的不是以#开头的行
grep "^[^#]" /etc/nginx/nginx.conf

案例5:要求匹配出2后面有任意数量的任意字符
grep "2." 1.txt

案例6:要求匹配出本机中所有的普通用户(uid 1000以后)
grep ":[0-9][0-9][0-9][0-9]" /etc/passwd

案例7:匹配一个或多个2
egrep "2+" 1.txt
或者
egrep "2{1,}" 1.txt
或者
egrep "22*" 1.txt

案例8:查询出3个2
egrep "2{3}" 1.txt

案例9:查询出包含 22 或者 33 的行
egrep "22|33" 1.txt

案例10:匹配出包含12341234的行
grep "12341234" 1.txt
或者
egrep "(1234){2}" 1.txt
或者
egrep "(1234)\1" 1.txt
或者
egrep "(1234)(1234)" 1.txt

案例11;要求匹配出包含1234abcd1234abcd的行
grep "1234abcd1234abcd" 1.txt
或者
egrep "(1234)(abcd)\1\2" 1.txt

练习1:过滤出当前系统IP
ip a | grep -o -E "([0-9]{1,3}\.){3}[0-9]{1,3}"
练习2:过滤出手机号
echo "15516134567" | grep -E "(155|187|136|166|177|138|137|188)[0-9]{8}"
练习3:过滤出邮箱
echo 要匹配的内容 | grep -E "[0-9a-zA-Z]+@[0-9a-z]+(\.com|\.com\.cn|\.edu|\.edu\.cn|\.top)"

3.4 sed(流式编辑器)

sed主要用来修改文件

1、sed命令

sed [参数] "[定位][指令]" 处理的文本路径
注:不指定定位,则默认处理全文。

2、sed的常用指令

p : 打印
d : 删除
a : 在当前行后添加一行或多行内容
c : 用新文件修改(替换)当前行中的文本
i : 在当前行之前插入文本
r : 从以外文件中读相关内容,写到相关行之后
w : 匹配到的行写入一个新的文件之中
y :将字符转换成一个新的字符
s : 用一个字符替整体替换成另外一个字符
g : 全局执行
i : 与s指令配合一起使用时,则是忽略大小写的作用

3、sed参数

-e : 允许多项编辑
-n : 取消默认输出
-i : 就地编辑文本
-r : 支持扩展正则表达式(sed中的正则表达式必须放在两个//中间)
-f :指定定位规则的文件

4、sed + 正则表达式(定位)

数字
    固定定位
        [root@localhost ~]# sed -n '2p' 1.txt 
    范围定位
        [root@localhost ~]# sed -n '1,3p' 1.txt 
正则
    正则表达式必须放在/ / 之间
    数字加数字
    数字加正则
    正则加数字
    正则加正则
    \c与c分隔符 \c与c只是一个代表,其中c可以换成任意一个字符

知识储备:正则匹配是非贪婪性的匹配
贪婪性是匹配到了之后,不停继续匹配,直至文件所有的内容全部匹配完毕
非贪婪性匹配,一旦匹配到了就停止匹配

5、案例

测试文本

1. hello hello world2. wold hello hello
# 3. nothing is important
# 4. i like movie movie
  # 原空白行
# hello hello world
wold hello hello
原空白行2
nothing is important
i like movie movie

sed 命令可以用来替换文本行、删除文本行,例子如下:

查找并替换每行第一个"hello""你好"sed 's/hello/你好/' 1.txt
查找替换每行中所有的"hello""你好"sed 's/hello/你好/g' 1.txt
删除含有"hello"的行:sed '/hello/d' 1.txt
删除第2行:sed '2d' 1.txt
删除第1行到最后一行:sed 'd' 1.txt
删除第2行到最后一行:sed '2,d' 1.txt
1、打印 1.txt 第一行和第五行
sed -e "1p" -e "5p" 1.txt
sed -e '1p' -e '5p' 1.txt

2、要求只打印 1.txt 第1,5,6三行
sed -n -e "1p" -e "5p" -e "6p" 1.txt
sed -e '1p' -e '5p' 1.txt -n

3、要求删除1.txt的第3行
sed -i "3d" 1.txt

4、删除/etc/fstab文件中所有的注释的行
sed -i -r "/^ *#|^$/d" /etc/fstab
会删除以#开头的行,允许有空白缩进

5、删除1.txt的3行,打印第4行
sed -f 2.txt 1.txt

6、将/etc/passwd文件复制到/root/3.txt中,然后删除当中包含/sbin/nologin的行
cat /etc/passwd > 3.txt
sed -i -r "/\/sbin\/nologin/d" 3.txt
cat 3.txt
或者:
sed -i -r "\c/sbin/nologincd" 3.txt

7、将/etc/nginx/nginx.conf文件中所有的注释的行(以#开头的行)全部删除
sed  -r "/^ *#/d" /etc/nginx/nginx.conf

8、在/etc/passwd文件中的第一行,到包含test的行,全部删除
sed -r "1,/test/d" /etc/passwd

9、删除从包含root的行到第5行的内容
sed -r "/root/,5d" /etc/passwd

10、从包含root的行删除到包含ftp的行
sed -r "/root/,/ftp/d" /etc/passwd

11、在1.txt第二行往后添加一行内容
sed "2a xxxx" 4.txt

12、用dzg替换第三行内容
sed "3c dzg" 1.txt

13、在第三行之前插入dzg
sed "3i dzg" 1.txt

14、在1.txt文件中1到3行之前插入helloworld
sed "1,3i helloword" 1.txt

15、把5.txt内容写到1.txt的1到3行之后
sed "1,3r 5.txt" 1.txt

16、把1.txt的前五行写到6.txt
sed "1,5w 6.txt" 1.txt

17、y :将字符转换成一个新的字符
sed  "1,5y/sbin/1234/" /etc/passwd
sbin ---> 1234
s ---> 1
b ---> 2
i ---> 3
n ---> 4

18、s : 用一个字符替整体替换成另外一个字符
sed "s/sbin/1234/" /etc/passwd

19、g : 全局执行
sed "s/sbin/1234/g" /etc/passwd

20、i : 与s指令配合一起使用时,则是忽略大小写的作用
sed "s/ROOT/1234/i" /etc/passwd

练习:
1:将虚拟机(192.168.15.200)中的ip替换成192.168.15.50
sed "s/\.200/\.50/g" /etc/sysconfig/network-scripts/ifcfg-eth[01]

2、删除1.txt中的所有奇数行
sed "1~2d" 1.txt

3、删除1.txt中的所有偶数行
sed "1~2! d" 1.txt

4:在1.txt每一行的行首增加#号 
sed  "s/^ */#/g" 1.txt
或者:
sed -r "s/(.*)/#\1/g" 1.txt

5:将Hello World替换成World Hello
sed -r "s/(Hello) (World)/\2 \1/g" 7.txt

6:将1.txt中的每一行都添加一个.bak的后缀
sed -r "s/(.*)/\1\.bak/g" 1.txt

参考:
linux 基础 by徐大大SEO - 知乎 https://www.zhihu.com/column/c_1423265882214236160

在线测试 JS/UIX - Terminal https://www.masswerk.at/jsuix/index.html

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值