zoukankan      html  css  js  c++  java
  • shell命令三剑客之sed命令详解

    shell中最核心的三个命令grep、sed、awk。
    其中,
    grep:文本搜索。
    sed:文本处理。
    awk:文本分析工具、语言。
    本文主要讲述sed命令的用法。

    1.初识sed命令

    1.1 sed命令是什么

    sed是一种支持正则表达式的非交互式流编辑器。是脚本中修改文本或者文本替换的最佳工具。

    1.2 sed工作原理

    sed工作在内存,有两个空间:

    • pattern space(模式空间):缓存空间,较多使用(模式空间里处理一行内容后,会将这一行内容删除。加载第2行内容);
    • hold space(保留空间):临时仓库,很少使用。

    工作原理:
    sed编辑器逐行处理文件,并将输出结果打印到屏幕上。sed命令将当前处理的行读入模式空间(pattern space)进行处理。sed在该行上执行完所有的命令后就将处理好的行打印到屏幕上(除非之前的命令删除了该行),sed处理完一行就将其从模式空间里删除,然后将下一行读入模式空间进行处理、显示。处理完文件的最后一行,sed便会结束运行。sed在临时缓冲区(模式空间)对文件进行处理,所以不会修改原文件,除非显示指明 -i 选项

    1.3 sed 命令怎么用

    sed的常用语法命令格式:

    sed [选项] sed编辑命令 输入文件
    其他shell命令 | sed [选项] sed编辑命令
    sed [选项] 输入文件

    sed的常用选项:

    • n:只显示匹配处理的行(否则会输出所有)
    • e:执行多个编辑命令时(一般用;代替)
    • i:直接在文件中进行修改,而不是输出到屏幕(此时不要接-n或-p命令,会导致源文件出问题)
    • r:支持扩展正则表达式
    • f:从脚本文件中读取内容并执行(文件中的编辑命令每行一个,不用;隔开)

    sed的常用编辑命令:

    • p:打印匹配行 print
    • d:删除指定行 delete
    • a:在匹配行后面追加 append
    • i:在匹配行前面插入 insert
    • c:整行替换
    • r:将文件的内容读入 read
    • w:将文本写入文件 write
    • s:字符串替换(匹配正则表达式)substitution

    sed里单引号和双引号的作用区别:

    • 双引号里可以使用shell里的变量;单引号不能。
    • 单引号和双引号里都可以存放模式。

    1.4 示例

    1.4.1 sed的n选项和编辑命令p的示例

    PS:文件sed.txt只有17行数据,每行内容分别为1,2,3,4......17。
    显示文件的第1、2行:

    [root@liupeng lp]# sed -n '1,2p' sed.txt 
    1
    2
    [root@liupeng lp]#
    

    或:

    [root@liupeng lp]# sed -n '3,$!p' sed.txt    -->即不显示从第3行到最后一行
    1
    2
    [root@liupeng lp]# 
    

    显示文件的第2至5行:

    [root@liupeng lp]# sed -n '2,5p' sed.txt 
    2
    3
    4
    5
    [root@liupeng lp]#
    

    或:

    [root@liupeng lp]# sed -n '2,+3p' sed.txt 
    2
    3
    4
    5
    [root@liupeng lp]# 
    

    显示文件的第10行:

    [root@liupeng lp]# sed -n '10p' sed.txt 
    10
    [root@liupeng lp]# 
    

    显示文件的最后一行:

    [root@liupeng lp]# sed -n '$p' sed.txt 
    17
    [root@liupeng lp]# 
    

    显示文件的1,3,5行:

    [root@liupeng lp]# sed -n '1p;3p;5p' sed.txt   -->注意此处变为了分号!
    1
    3
    5
    [root@liupeng lp]# 
    

    显示单数行:

    [root@liupeng lp]# sed -n '1~2p' sed.txt   --> ~表示步长
    1
    3
    5
    7
    9
    11
    13
    15
    17
    [root@liupeng lp]# 
    

    显示偶数行:

    [root@liupeng lp]# sed -n '0~2p' sed.txt 
    2
    4
    6
    8
    10
    12
    14
    16
    [root@liupeng lp]# 
    

    加入模式:
    这里的模式可以是正则表达式也可以是精确字符,
    模式用/括起,扩展正则要加 -r选项。

    sed -n '/模式/p’ 输入文件

    显示包含2的行:

    [root@liupeng lp]# sed -n '/2/p' sed.txt 
    2
    12
    [root@liupeng lp]# 
    

    不显示1开头的行:

    [root@liupeng lp]# sed -rn '/^1/!p' sed.txt 
    2
    3
    4
    5
    6
    7
    8
    9
    [root@liupeng lp]# 
    

    显示以2为结尾的行:

    [root@liupeng lp]# sed -n '/2$/p' sed.txt 
    2
    12
    [root@liupeng lp]# 
    

    显示以1和3开头的行:

    [root@liupeng lp]# sed -n '/^[1,3]/p' sed.txt 
    1
    3
    10
    11
    12
    13
    14
    15
    16
    17
    [root@liupeng lp]#
    

    1.4.2 sed的d编辑命令(不删除原文件内容)示例

    删除操作可以根据行号和模式匹配进行操作。
    删除1-15行:

    [root@liupeng lp]# sed '1,15d' sed.txt 
    16
    17
    [root@liupeng lp]# 
    

    删除包含数字1的行:

    [root@liupeng lp]# sed '/1/d' sed.txt 
    2
    3
    4
    5
    6
    7
    8
    9
    [root@liupeng lp]# 
    

    除了包含数字1的行都删除:

    [root@liupeng lp]# sed '/1/!d' sed.txt 
    1
    10
    11
    12
    13
    14
    15
    16
    17
    [root@liupeng lp]# 
    

    删除空行和注释:

    [root@liupeng lp]# sed -r '/^$|^#/d' sed.txt  -->^$指空行;^# 以#开头的行,即注释行
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    [root@liupeng lp]# 
    

    删除空行再删除注释行:

    [root@liupeng lp]# sed -e '/^$/d' -e '/^#/d' sed.txt -->第二个-e用分号代替也可以
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    [root@liupeng lp]# 
    

    1.4.3 sed的编辑命令之a追加命令示例

    追加操作可以根据行号和模式匹配进行操作 (不更改原文件)。
    新建一个sed2.txt文件,内容为数字1~7。

    [root@liupeng lp]# cat sed2.txt 
    1
    2
    3
    4
    5
    6
    7
    [root@liupeng lp]#
    

    在第一行后面追加字符串abcabc:

    [root@liupeng lp]# sed '1a abcabc' sed2.txt 
    1
    abcabc
    2
    3
    4
    5
    6
    7
    [root@liupeng lp]#
    

    在包含数字2的行下面追加字符串bcbcbc:

    [root@liupeng lp]# sed '/2/a bcbcbc' sed2.txt 
    1
    2
    bcbcbc
    3
    4
    5
    6
    7
    [root@liupeng lp]# 
    

    1.4.4 sed的编辑命令之i插入命令示例

    插入操作可以根据行号和模式匹配进行操作 。

    在最后一行的前面插入字符串bcbcbc:

    [root@liupeng lp]# sed '$i bcbcbc' sed2.txt 
    1
    2
    3
    4
    5
    6
    bcbcbc
    7
    [root@liupeng lp]# 
    

    在包含数字3的行前面插入字符串bcbcbc:

    [root@liupeng lp]# sed '/3/i bcbcbc' sed2.txt 
    1
    2
    bcbcbc
    3
    4
    5
    6
    7
    [root@liupeng lp]# 
    

    1.4.5 sed的编辑命令之c替换命令示例

    更改整行操作可以根据行号和模式匹配进行操作。

    将数字2所在的行替换成字符串bcbcbc:

    [root@liupeng lp]# sed '/2/c bcbcbc' sed2.txt 
    1
    bcbcbc
    3
    4
    5
    6
    7
    [root@liupeng lp]# 
    

    将第三行替换成字符串bcbcbc:

    [root@liupeng lp]# sed '3c bcbcbc' sed2.txt 
    1
    2
    bcbcbc
    4
    5
    6
    7
    [root@liupeng lp]# 
    

    1.4.6 sed的编辑命令之r读入命令示例

    读入操作可以根据行号和模式匹配进行操作。

    在sed2.txt文件的末尾后面读入/etc/passwd文件的所有内容:

    [root@liupeng lp]# sed '$r /etc/passwd' sed2.txt 
    1
    2
    3
    4
    5
    6
    7
    root:x:0:0:root:/root:/bin/bash
    bin:x:1:1:bin:/bin:/sbin/nologin
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    ......
    [root@liupeng lp]# 
    

    在/dev/sda1后面读入sed2.txt文件的内容:

    [root@liupeng lp]# df -h | sed '/dev/sda1/r sed2.txt'
    文件系统	      容量  已用  可用 已用%% 挂载点
    /dev/mapper/vg_liupeng-lv_root
                           18G   13G  4.2G  75% /
    tmpfs                 491M   88K  491M   1% /dev/shm
    /dev/sda1             485M   33M  427M   8% /boot
    1
    2
    3
    4
    5
    6
    7
    [root@liupeng lp]#         
    

    1.4.7 sed的编辑命令之w写入命令示例(w命令不加-i也是直接修改原文件!)

    写入文件操作可以根据行号和模式匹配进行操作。

    将文件/etc/passwd的第一行写到sed2.txt(和r读入命令顺序正好相反):

    [root@liupeng lp]# sed '1w sed2.txt' /etc/passwd
    root:x:0:0:root:/root:/bin/bash
    bin:x:1:1:bin:/bin:/sbin/nologin
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    ......
    [root@liupeng lp]# cat sed2.txt 
    root:x:0:0:root:/root:/bin/bash
    [root@liupeng lp]# 
    

    将文件/etc/inittab所有不是#开头的行都写入sed2.txt:

    [root@liupeng lp]# sed '/^#/!w sed2.txt' /etc/inittab 
    # inittab is only used by upstart for the default runlevel.
    #
    # ADDING OTHER CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.
    #
    # System initialization is started by /etc/init/rcS.conf
    #
    # Individual runlevels are started by /etc/init/rc.conf
    #
    # Ctrl-Alt-Delete is handled by /etc/init/control-alt-delete.conf
    #
    # Terminal gettys are handled by /etc/init/tty.conf and /etc/init/serial.conf,
    # with configuration in /etc/sysconfig/init.
    #
    # For information on how to write upstart event handlers, or how
    # upstart works, see init(5), init(8), and initctl(8).
    #
    # Default runlevel. The runlevels used are:
    #   0 - halt (Do NOT set initdefault to this)
    #   1 - Single user mode
    #   2 - Multiuser, without NFS (The same as 3, if you do not have networking)
    #   3 - Full multiuser mode
    #   4 - unused
    #   5 - X11
    #   6 - reboot (Do NOT set initdefault to this)
    # 
    id:5:initdefault:
    [root@liupeng lp]# cat sed2.txt 
    id:5:initdefault:
    [root@liupeng lp]# 
    

    1.4.8 sed的编辑命令之替换s命令示例

    sed -n [行号或模式]s/查找内容/替换内容/[替换标记] 文件

    替换操作可以根据行号和模式匹配进行操作。

    新建一个sed2.txt文件,内容如下:

    [root@liupeng lp]# cat sed2.txt
    1 1 1
    2 2 2
    3 3 3
    22 2 222
    4 4 4
    5 5 5
    6 6 6
    7 7 7
    [root@liupeng lp]# 
    

    替换标记有四种:
    数字:替换每行的第几个。

    • g:全局替换,否则只替换第一个字符串。
    • p:显示被执行替换操作的行,与-n合用。
    • w:将执行替换操作的行输出到指定文件。

    示例:
    将sed2.txt中每行的第二个数字2替换成bb:

    [root@liupeng lp]# sed -n 's/2/bb/2p' sed2.txt 
    2 bb 2
    2bb 2 222
    [root@liupeng lp]# 
    

    将文件中找到以id开头的行中的:3:替换成:5:(先用^id找出行):

    [root@liupeng lp]# sed '/^id/s/5/77/' /etc/inittab 
    # inittab is only used by upstart for the default runlevel.
    #
    .....
    # 
    id:77:initdefault:
    [root@liupeng lp]# 
    

    将sed2.txt文件中的空格全部替换为冒号:

    [root@liupeng lp]# sed 's/ /:/g' sed2.txt 
    1:1:1
    2:2:2
    3:3:3
    22:2:222
    4:4:4
    5:5:5
    6:6:6
    7:7:7
    [root@liupeng lp]# 
    

    将sed2.txt文件中的空格全部替换成分号,同时将数字6全部替换成逗号:

    [root@liupeng lp]# sed 's/ /;/g ; s/6/,/g' sed2.txt 
    1;1;1
    2;2;2
    3;3;3
    22;2;222
    4;4;4
    5;5;5
    ,;,;,
    7;7;7
    [root@liupeng lp]# 
    

    在文件sed2.txt的2到3行前面加上注释:

    [root@liupeng lp]# sed -n '2,3s/^/#/p' sed2.txt 
    #2 2 2
    #3 3 3
    [root@liupeng lp]# cat sed2.txt 
    1 1 1
    2 2 2
    3 3 3
    22 2 222
    4 4 4
    5 5 5
    6 6 6
    7 7 7
    [root@liupeng lp]# 
    

    在文件sed2.txt的每行末尾加上问号:

      [root@liupeng lp]# sed -n 's/$/?/p' sed2.txt 
    1 1 1?
    2 2 2?
    3 3 3?
    22 2 222?
    4 4 4?
    5 5 5?
    6 6 6?
    7 7 7?
    [root@liupeng lp]#     
    

    或:

    [root@liupeng lp]# sed 's/$/?/' sed2.txt 
    1 1 1?
    2 2 2?
    3 3 3?
    22 2 222?
    4 4 4?
    5 5 5?
    6 6 6?
    7 7 7?
    [root@liupeng lp]# 
    

    1.5 sed的s编辑命令可以使用任意分隔符作为定界符

    例如:
    把/etc/passwd文件中root开头的行的/bin/bash替换成hahaha(用|做定界符):

    [root@liupeng lp]# sed -n '/^root/s|/bin/bash|hahaha|p' /etc/passwd
    root:x:0:0:root:/root:hahaha
    [root@liupeng lp]# 
    

    以分号做定界符:

    [root@liupeng lp]# sed -n '/^root/s;/bin/bash;hahaha;p' /etc/passwd
    root:x:0:0:root:/root:hahaha
    [root@liupeng lp]# 
    

    1.6 sed 命令的-i 选项

    -i选项是直接修改文件,小心使用 !!

    用法格式:sed -i '/模式/s/源字符/替换成/g' 文件名

    示例:用sed命令的-i选项,将sed2.txt文件中以数字22开头的行中的22全部替换成字符a:

    [root@liupeng lp]# cat sed2.txt 
    1 1 1
    2 2 2
    3 3 3
    22 2 222
    4 4 4
    5 5 5
    6 6 6
    7 7 7
    [root@liupeng lp]# sed -i '/^22/s/22/a/g' sed2.txt 
    [root@liupeng lp]# cat sed2.txt 
    1 1 1
    2 2 2
    3 3 3
    a 2 a2
    4 4 4
    5 5 5
    6 6 6
    7 7 7
    [root@liupeng lp]# 
    

    1.7 sed的编辑命令补充之:G命令

    G:把缓存空间里的东西追加到模式空间的行后。
    例:在sed2.txt文件的每行后面加空行。

    [root@liupeng lp]# sed 'G' sed2.txt 
    1 1 1
    
    2 2 2
    
    3 3 3
    
    a 2 a2
    
    4 4 4
    
    5 5 5
    
    6 6 6
    
    7 7 7
    
    [root@liupeng lp]# cat sed2.txt 
    1 1 1
    2 2 2
    3 3 3
    a 2 a2
    4 4 4
    5 5 5
    6 6 6
    7 7 7
    [root@liupeng lp]#
    

    一个例子来理解2个模式:
    在sed的工作原理中我们提到,sed工作在内存,有两个空间:

    • pattern space(模式空间):缓存空间,较多使用(模式空间里处理一行内容后,会将这一行内容删除。加载第2行内容);
    • hold space(保留空间):临时仓库,很少使用。

    下面我们举个例子来理解一下这两个空间。

    首先新建一个test.txt文件,内容如下:

    [root@liupeng lp]# cat test.txt 
    xiaomi
    huawei
    huawei
    apple
    huawei
    samsung
    huawei
    [root@liupeng lp]#
    

    接着我们执行命令“sed '/huawei/h;G' test.txt”,会发现输出的内容很值得思考:

    [root@liupeng lp]# sed '/huawei/h;G' test.txt
    xiaomi
    
    huawei
    huawei
    huawei
    huawei
    apple
    huawei
    huawei
    huawei
    samsung
    huawei
    huawei
    huawei
    [root@liupeng lp]# 
    

    会如此显示的原因如下:

    ①先查找huawei,如果符合条件就将这行的内容写到hold space里,接着执行G命令,就会将hold space里的内容追加到pattern space后面,然后输出到屏幕。
    ②因为第一行是xiaomi,不符合/huawei/模式条件,所以不将xiaomi复制到hold space里,又因为hold space里开始时默认是空的,所以会在xiaomi后面添加一行空行。
    ③第2行的内容刚好就是huawei,符合模块的条件,就将huawei这行复制到hold space里,替换了原来里面的空的内容。接着执行G命令,又将huawei追加到pattern space空间的后面,所以有2个huawei,后面的行以此类推。

    1.8 sed命令特殊用法

    • &符号:&符号表示前面找到的模式匹配内容。

    示例:找出/etc/passwd文件中uid100~999的,在后面都加个0

    [root@liupeng lp]# cat -n /etc/passwd|sed -n -r 's/[0-9]{3}/&0/p'
        12	games:x:12:1000:games:/usr/games:/sbin/nologin
        17	usbmuxd:x:1130:113:usbmuxd user:/:/sbin/nologin
        18	avahi-autoipd:x:1700:170:Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin
        21	rtkit:x:4990:497:RealtimeKit:/proc:/sbin/nologin
        22	abrt:x:1730:173::/etc/abrt:/sbin/nologin
        26	saslauth:x:4980:76:"Saslauthd user":/var/empty/saslauth:/sbin/nologin
        30	nfsnobody:x:655034:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
        31	pulse:x:4970:496:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin
        35	mysql:x:4960:493::/home/mysql:/bin/bash
    [root@liupeng lp]# 
    
    • 标签

    标签:sed使用圆括号定义替换模式中的部分字符。
    标签可以方便在后面引用,每行指令最多使用9个标签。

    示例1:用sed取出passwd里面的第一列。

     1表示第一个标签,用第一个标签(^[0-Z]+)把前面符合第一个和第二个的全部取代:
    [root@liupeng lp]# cat /etc/passwd|sed -r 's/(^[0-Z]+)(.*)/1/' 
    root
    bin
    daemon
    ......
    [root@liupeng lp]# 
    

    示例2:删除/etc/passwd第一个字段.
    思路:用第2个标签(.*)把前面的符合第一个和第二个的全部取代。

    [root@liupeng lp]# cat /etc/passwd | sed -r 's/(^[0-Z]+)(.*)/2/'
    :x:0:0:root:/root:/bin/bash
    :x:1:1:bin:/bin:/sbin/nologin
    :x:2:2:daemon:/sbin:/sbin/nologin
    ......
    [root@liupeng lp]# 
    

    示例3:注意小括号之间有空格:

    [root@liupeng lp]# echo aaa bbb ccc|sed -r 's/([a-z]+) ([a-z]+) ([a-z]+)/3#2#1/'
    ccc#bbb#aaa
    [root@liupeng lp]# 
    

    1.9 sed的s命令中支持 s(正则里表示空白)

    具体示例在上面的代码中有,用到 换行时,前面不用加反斜杠来释义。

    2 练习

    1.sed取出/etc/passwd文件的第一列。
    2.sed将PATH环境变量中的冒号换成换行。
    3.sed将PATH环境变量斜杠/换成斜杠。
    4.sed修改SELINUX配置文件从开启变成禁用(/etc/sysconfig/selinux)。
    5.去掉/etc/passwd文件中第二个地段的x。
    6.修改/etc/inittab文件里的3或者5修改为6。
    7.用sed命令删除"cat -n /etc/passwd"每行前面的空格和数字。
    (答案放在本文最后)。

    答案:
    1.sed取出/etc/passwd文件的第一列。

    [root@liupeng lp]# cat /etc/passwd|sed -r 's/(^[0-Z]+)(.*)/1/'
    root
    bin
    daemon
    ......
    [root@liupeng lp]# 
    

    --》1表示第一个标签

    2.sed将PATH环境变量中的冒号换成换行。

    [root@liupeng lp]# echo $PATH|sed 's/:/
    /g'
    /usr/lib64/qt-3.3/bin
    /usr/local/sbin
    /usr/local/bin
    /sbin
    /bin
    /usr/sbin
    /usr/bin
    /root/bin
    /usr/local/python3.6.4/bin
    [root@liupeng lp]# echo $PATH
    /usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/python3.6.4/bin
    [root@liupeng lp]# 
    

    3.sed将PATH环境变量斜杠/换成斜杠。

    [root@liupeng lp]# echo $PATH|sed -r 's///\/g'
    usrlib64qt-3.3in:usrlocalsbin:usrlocalin:sbin:in:usrsbin:usrin:
    ootin:usrlocalpython3.6.4in
    [root@liupeng lp]# 
    

    或者用井号来做定界符:

    [root@liupeng lp]# echo $PATH|sed -r 's#/#\#g'
    usrlib64qt-3.3in:usrlocalsbin:usrlocalin:sbin:in:usrsbin:usrin:
    ootin:usrlocalpython3.6.4in
    [root@liupeng lp]# 
    

    4.sed修改SELINUX配置文件从开启变成禁用(/etc/sysconfig/selinux)。

    [root@liupeng lp]# cat /etc/sysconfig/selinux|sed  '/^SELINUX=/s/enforcing/disabled/g'
    
    # This file controls the state of SELinux on the system.
    # SELINUX= can take one of these three values:
    #     enforcing - SELinux security policy is enforced.
    #     permissive - SELinux prints warnings instead of enforcing.
    #     disabled - No SELinux policy is loaded.
    SELINUX=disabled
    # SELINUXTYPE= can take one of these two values:
    #     targeted - Targeted processes are protected,
    #     mls - Multi Level Security protection.
    SELINUXTYPE=targeted 
    
    
    [root@liupeng lp]# 
    

    5.去掉/etc/passwd文件中第二个地段的x。

    [root@liupeng lp]# cat /etc/passwd | sed 's/:x:/::/g'
    root::0:0:root:/root:/bin/bash
    bin::1:1:bin:/bin:/sbin/nologin
    ......
    [root@liupeng lp]#
    [root@liupeng lp]# cat /etc/passwd
    root:x:0:0:root:/root:/bin/bash
    bin:x:1:1:bin:/bin:/sbin/nologin
    ......
    

    6.把/etc/inittab文件里的3或者5修改为6。

    [root@liupeng lp]# cat /etc/inittab | sed -r '/^id/s/:[35]:/:6:/g'
    ......
    id:6:initdefault:
    [root@liupeng lp]# cat /etc/inittab
    ......
    id:5:initdefault:
    [root@liupeng lp]# 
    

    7.用sed命令删除"cat -n /etc/passwd"每行前面的空格和数字。
    方法1,用标签来替换。

    [root@liupeng lp]# cat -n /etc/passwd | sed -r 's/(s+[0-9]+s+)(.*)/2/'
    root:x:0:0:root:/root:/bin/bash
    bin:x:1:1:bin:/bin:/sbin/nologin
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    ......
    [root@liupeng lp]# 
    

    方法2,使用正则去匹配,然后用空的内容去替换。

    [root@liupeng lp]# cat -n /etc/passwd | sed -r 's/s+[0-9]+s+//'
    root:x:0:0:root:/root:/bin/bash
    bin:x:1:1:bin:/bin:/sbin/nologin
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    ......
    [root@liupeng lp]# 
    

    欢迎大家关注:
    在这里插入图片描述
    -----------END-------------

  • 相关阅读:
    python远程连接服务器并查看服务器上的文件
    python中xe6x80xa5xe8xafx8a如何转为中文
    idea+testng+maven环境搭建
    Django restfulframework系列
    django-基于函数的视图与基于类的视图
    yaml结合数据驱动编写测试用例
    pycharm社区版找不到工具栏找不到Database的解决办法
    Content-Type 对照表
    ffmpeg C# 切第一秒的有图片
    Angular HttpClient POST 服务器(springboot)获取不到参数问题
  • 原文地址:https://www.cnblogs.com/lpeng94/p/12637956.html
Copyright © 2011-2022 走看看