• 第五天、vim,重定向,用户和组管理


    第五天、vim,重定向,用户和组管理

    vim


    • vi:Visual editor,文本编辑器
    • 行编辑器:sed
    • 全屏编辑器:vim,vi,nano
    • 其他编辑器gedit,gvim

    • 定义别名让vi等于vim;将alias vi=vim写入~/.bashrc或者全局配置文件

    vim打开文件

    1、打开文件后光标跳到第9行

    [root@centos7 ~]# vim +9 1.txt
    

    效果:

    2、直接跳到含有qqq的那一行

    [root@centos7 ~]# vim +/qqq 1.txt
    

    效果:

    3、以二进制方式打开文件,如果要改二进制文件

    [root@centos7 ~]# vim -b /usr/bin/ls
    

    4、打开两个文件对比

    [root@centos7 ~]# vim -d 1.txt 2.txt
    

    效果,使用:qall退出


    vim的三个模式

    • 命令模式
    • 插入模式
    • 拓展模式

    三种模式转换

    命令模式进入插入模式

    • i:在光标前插入内容
    • I:在光标所在行首插入内容
    • a:在光标后插入内容
    • A:在光标所在行尾插入内容
    • o:在光标所在行下插入新的一行
    • O:在光标所在行上插入新的一行

    关闭并保存文件

    • :wq
    • :x
    • ZZ

    拓展命令模式

    1、读文件到当前文件中:

    :r /etc/hostname
    

    效果:

    2、将当前文件写入令一文件中,即windows中的另存为

    :w /data/hello.txt
    

    效果:

    3、执行命令

    :!hostname
    

    效果:

    4、执行命令并将输出写入当前文件

    :r! free -h
    

    效果:


    命令模式光标的跳转

    • k,j,h,l
    • 数字直接回车
    • H,M,L
    • zt,zz,zb
    • ^:行首非空字符,$:行尾,0:行首
    • gg:第一行;G:最后一行;5gg:第五行
    • (,),{,},

    翻屏(少用)

    • CTRL+f,CTRL+b,CTRL+d,CTRL+u

    命令模式操作

    字符编辑

    • x:删单个字符;5x:删5个字符;10x:删10个字符
    • xp交换光标除和光标后字符位置
    • ~:转换大小写
    • J:删除当前行换行符,让下一行接到本行后面

    替换

    • r:替换光标所在处
    • R:切换成REPLACE模式

    删除

    注意:删除的内容会保存在粘贴板,按p可以粘贴

    • dd:删一行
    • d$:删到行尾
    • d^:删到行首非空字符
    • d0:删到行首
    • 5dd:删5行;6dd:删6行
    • dw,de,db

    复制

    注意:复制后的内容也会保存在粘贴板,按p可以粘贴

    • yy:复制一行
    • y$:复制到行尾
    • y^:复制到行首非空字符
    • y0:复制到行首
    • 5yy:复制5行,10yy:复制10行
    • ye,yw,yb

    改变命令

    • cc:删除当前行内容,重新编辑
    • c$:删除到行尾并重新编辑
    • c^:删除到行首非空字符并重新编辑
    • c0:删除到行首并重新编辑
    • 3cc:删除3行并重新编辑

    特殊操作

    • 100iwang,ESC 会粘贴wang100次

    • vim显示颜色

    效果

    • di"表示删除""中间的内容;di(表示删除()中间的内容;di{表示删除{}中间的内容
    • yi"表示复制""中间的内容;yi(表示复制()中间的内容;yi{表示复制{}中间的内容
    • vi"表示选中""中间的内容;vi(表示选中()中间的内容;vi{}表示选中{}中间的内容
    • dtx:删字符直到遇到x停止
    • ytx:复制字符直到遇到x停止

    扩展模式范围表示

    • 2,3表示第2行到第三行
    • 2,+3表示第2行开始,再加3行,即第2行到第5行
    • .表示当前行,$表示最后一行
    • .,$-1表示当前行到倒数第二行
    • %表示全文,相当于1,$

    扩展命令模式的地址定界

    • :/qqq/ 匹配包含qqq的行;/qqq 同样也是查找包含qqq的行,n,N向下向上找
    • :2,5d 删除第2到第5行
    • :3,8y 复制第三行到第8行

    撤销与反撤销

    • u:撤销 5u:撤销5次
    • CTRL+r:反撤销
    • .:重复前一个操作 5.:重复之前操作5次

    vim寄存器(少用)

    • 3"tyy 存到t寄存器

    使用多个窗口

    水平分割

    上下切换:CTRL+w,↑ CTRL+w,↓

    [root@centos7 ~]# vim -o 1.txt 2.txt
    
    效果:

    垂直分割

    左右切换:CTRL+w,← CTRL+w,→

    [root@centos7 ~]# vim -O 1.txt 2.txt
    
    效果:

    单文件窗口分割

    • CTRL+w,s CTRL+w,v CTRL+w,q CTRL+w,o :wqall

    定制vim的工作特性

    • :set nu 显示行号 :set nonu 不显示行号
    • :set ai 开启缩进 :set noai 关闭缩进
    • :set hlsearch 开始高亮搜索 :set nohlsearch 关闭高亮搜索
    • :set list 显示Tab和换行符 :set nolist 不显示Tab和换行符
    • :syntax on 启动语法高亮 :syntax:禁用用法高亮
    • :set ff=dos 启动windows格式 set ff=unix 启动unix格式
    • :set textwidth=65 设置文本宽度
    • :set cul 每光标所在行显示标识线 :set nocul 不显示标识线

    set帮助,vim帮助

    • :help option-list
    • :set :set all
    • :help
    • 命令vimtutor

    重定向基础

    • 三种I/O设备:0,1,2 标准输入,标准输出,标准错误
    [root@centos7 ~]# ll /dev/std*
    lrwxrwxrwx. 1 root root 15 7月  24 08:50 /dev/stderr -> /proc/self/fd/2
    lrwxrwxrwx. 1 root root 15 7月  24 08:50 /dev/stdin -> /proc/self/fd/0
    lrwxrwxrwx. 1 root root 15 7月  24 08:50 /dev/stdout -> /proc/self/fd/1
    
    重定向输出内容到另一终端窗口

    1、开启两终端窗口,tty命令看第一个终端号

    2、第二个窗口输入命令

    [root@centos7 ~]# free > /dev/pts/3
    [root@centos7 ~]# 
    

    3、第一个窗口显示如下:

    [root@centos7 ~]# tty
    /dev/pts/3
    [root@centos7 ~]#               total        used        free      shared  buff/cache   available
    Mem:        2028088      249760       78856        3564     1699472     1504260
    Swap:       4194300       76288     4118012
    
    

    dd命令生成一个50m的文件,然后清空

    如果bigfile该文件正在被某程序读取,那么rm -rf bigfile只是表面删除,磁盘空间并没有释放,此时再执行> bigfile即可释放磁盘空间。

    生产中一般日志太大了都用> bigfile此办法清理日志,而不是rm

    [root@centos7 data]# dd if=/dev/zero of=./bigfile bs=1M count=50
    记录了50+0 的读入
    记录了50+0 的写出
    52428800字节(52 MB)已复制,0.695109 秒,75.4 MB/秒
    [root@centos7 data]# ll bigfile 
    -rw-r--r--. 1 root root 52428800 7月  25 10:53 bigfile
    [root@centos7 data]# ll -h bigfile 
    -rw-r--r--. 1 root root 50M 7月  25 10:53 bigfile
    [root@centos7 data]# > bigfile 
    [root@centos7 data]# ll -h bigfile 
    -rw-r--r--. 1 root root 0 7月  25 10:54 bigfile
    

    >与>>

    一个> 表示覆盖,>>两个>是追加

    touch创建已有文件会刷新源文件的三个时间,但内容不会动

    [root@centos7 data]# stat a.log
      文件:"a.log"
      大小:16        	块:8          IO 块:4096   普通文件
    设备:803h/2051d	Inode:8847        硬链接:1
    权限:(0644/-rw-r--r--)  Uid:(    0/    root)   Gid:(    0/    root)
    环境:unconfined_u:object_r:etc_runtime_t:s0
    最近访问:2019-07-24 15:51:30.467199007 +0800
    最近更改:2019-07-24 15:51:28.453199107 +0800
    最近改动:2019-07-24 15:51:28.453199107 +0800
    创建时间:-
    [root@centos7 data]# touch a.log 
    [root@centos7 data]# stat a.log
      文件:"a.log"
      大小:16        	块:8          IO 块:4096   普通文件
    设备:803h/2051d	Inode:8847        硬链接:1
    权限:(0644/-rw-r--r--)  Uid:(    0/    root)   Gid:(    0/    root)
    环境:unconfined_u:object_r:etc_runtime_t:s0
    最近访问:2019-07-25 10:59:58.509834591 +0800
    最近更改:2019-07-25 10:59:58.509834591 +0800
    最近改动:2019-07-25 10:59:58.509834591 +0800
    创建时间:-
    

    使用追加符号>>创建已有文件,不会刷新文件的三个时间,内容也不会改变

    [root@centos7 data]# stat a
      文件:"a"
      大小:8         	块:8          IO 块:4096   普通文件
    设备:803h/2051d	Inode:68          硬链接:1
    权限:(0644/-rw-r--r--)  Uid:(    0/    root)   Gid:(    0/    root)
    环境:unconfined_u:object_r:etc_runtime_t:s0
    最近访问:2019-07-24 11:22:49.816547042 +0800
    最近更改:2019-07-20 19:51:02.893407098 +0800
    最近改动:2019-07-20 19:51:02.893407098 +0800
    创建时间:-
    [root@centos7 data]# >> a
    [root@centos7 data]# stat a
      文件:"a"
      大小:8         	块:8          IO 块:4096   普通文件
    设备:803h/2051d	Inode:68          硬链接:1
    权限:(0644/-rw-r--r--)  Uid:(    0/    root)   Gid:(    0/    root)
    环境:unconfined_u:object_r:etc_runtime_t:s0
    最近访问:2019-07-24 11:22:49.816547042 +0800
    最近更改:2019-07-20 19:51:02.893407098 +0800
    最近改动:2019-07-20 19:51:02.893407098 +0800
    创建时间:-
    

    重定向操作

    • 1>等于>,重定向的是标准输出
    • 2>,重定向的是标准错误
    • &>所有输出重定向到文件 >/dev/null 2>&1
    • set -C执行后可以禁止将内容覆盖到已有文件;可以使用>|进行强制覆盖
    • set +C(默认)允许覆盖
    练习1,标准错误和标准输出分别重定向到不同文件
    [root@centos7 data]# ll all.log  xxxx
    ls: 无法访问xxxx: 没有那个文件或目录
    -rw-r--r--. 1 root root 6 7月  25 11:01 all.log
    [root@centos7 data]# ll all.log  xxxx > stdout.log 2> stderror.log
    [root@centos7 data]# cat stdout.log 
    -rw-r--r--. 1 root root 6 7月  25 11:01 all.log
    [root@centos7 data]# cat stderror.log 
    ls: 无法访问xxxx: 没有那个文件或目录
    
    练习2,将所有输出都重定向到某个文件

    ll all.log xxxx &> std.log

    或者

    ll all.log xxxx > std.log 2>&1

    或者

    [root@centos7 data]# ll all.log  xxxx
    ls: 无法访问xxxx: 没有那个文件或目录
    -rw-r--r--. 1 root root 6 7月  25 11:01 all.log
    [root@centos7 data]# ll all.log  xxxx &> std.log
    [root@centos7 data]# cat std.log 
    ls: 无法访问xxxx: 没有那个文件或目录
    -rw-r--r--. 1 root root 6 7月  25 11:01 all.log
    

    错误写法:

    2>&1 > /dev/null
    

    计算1+...+100

    [root@centos7 ~]# echo {1..100} | tr ' ' '+'
    1+2+3+4+5+6+7+8+9+10+11+12+13+14+15+16+17+18+19+20+21+22+23+24+25+26+27+28+29+30+31+32+33+34+35+36+37+38+39+40+41+42+43+44+45+46+47+48+49+50+51+52+53+54+55+56+57+58+59+60+61+62+63+64+65+66+67+68+69+70+71+72+73+74+75+76+77+78+79+80+81+82+83+84+85+86+87+88+89+90+91+92+93+94+95+96+97+98+99+100
    [root@centos7 ~]# echo {1..100} | tr ' ' '+' | bc
    5050
    [root@centos7 ~]# seq -s'+' 100 
    1+2+3+4+5+6+7+8+9+10+11+12+13+14+15+16+17+18+19+20+21+22+23+24+25+26+27+28+29+30+31+32+33+34+35+36+37+38+39+40+41+42+43+44+45+46+47+48+49+50+51+52+53+54+55+56+57+58+59+60+61+62+63+64+65+66+67+68+69+70+71+72+73+74+75+76+77+78+79+80+81+82+83+84+85+86+87+88+89+90+91+92+93+94+95+96+97+98+99+100
    [root@centos7 ~]# seq -s'+' 100 | bc
    5050
    

    将etc/issue转换为大写

    [root@centos7 ~]# cat /etc/issue | tr [a-z] [A-Z]
    CURRENT TERMINEL:L
    CURRENT TIME:T
    CURRENT HOSTNAME:S
    S
    KERNEL R ON AN M
    
    [root@centos7 ~]# cat /etc/issue | tr [:lower:] [:upper:]
    CURRENT TERMINEL:L
    CURRENT TIME:T
    CURRENT HOSTNAME:S
    S
    KERNEL R ON AN M
    
    

    处理字符串“xt.,l 1 jr#!$mn 2 c*/fe 3 uz 4”,只保留其中的数字和空格

    [root@centos7 ~]# echo 'xt.,l 1 jr#!$mn 2 c*/fe 3 uz 4' | tr -dc ' 0-9'
     1  2  3  4
    

    删除windows中记事本中的回车符 (十六进制是0d)

    [root@centos7 ~]# file win.txt 
    win.txt: ASCII text, with CRLF line terminators
    [root@centos7 ~]# hexdump -C win.txt 
    00000000  61 62 63 0d 0a 64 65 66                           |abc..def|
    00000008
    [root@centos7 ~]# tr -d '
    ' < win.txt > win2.txt
    [root@centos7 ~]# file win2.txt 
    win2.txt: ASCII text
    [root@centos7 ~]# hexdump -C win2.txt 
    00000000  61 62 63 0a 64 65 66                              |abc.def|
    00000007
    [root@centos7 ~]# cat win2.txt 
    abc
    def
    

    cat和tee写入文件的方法(经常用)

    cat > win2.txt <<EOF 一个>是覆盖,两个>是追加

    [root@centos7 ~]# cat > win2.txt <<EOF
    > hello
    > world
    > EOF
    [root@centos7 ~]# cat win2.txt 
    hello
    world
    

    tee win2.txt <<EOF tee命令默认是覆盖文件,并且会把输入的内容打印一遍

    [root@centos7 ~]# tee win2.txt <<EOF
    > hello
    > world!
    > EOF
    hello
    world!
    

    tee如果要追加使用-a选项

    [root@centos7 ~]# tee -a win2.txt <<EOF
    > i am bob.
    > EOF
    i am bob.
    [root@centos7 ~]# cat win2.txt 
    hello
    world!
    i am bob.
    

    mail给qqq用户发一封邮件,标题为hi

    [root@centos7 ~]# mail -s hi qqq < win2.txt
    

    qqq收邮件

    [qqq@centos7 ~]$ mail
    Heirloom Mail version 12.5 7/5/10.  Type ? for help.
    "/var/spool/mail/qqq": 1 message 1 new
    >N  1 root                  Thu Jul 25 14:15  20/602   "hi"
    & 1
    Message  1:
    From root@centos7.localdomain  Thu Jul 25 14:15:39 2019
    Return-Path: <root@centos7.localdomain>
    X-Original-To: qqq
    Delivered-To: qqq@centos7.localdomain
    Date: Thu, 25 Jul 2019 14:15:39 +0800
    To: qqq@centos7.localdomain
    Subject: hi
    User-Agent: Heirloom mailx 12.5 7/5/10
    Content-Type: text/plain; charset=us-ascii
    From: root@centos7.localdomain (root)
    Status: R
    
    hello
    world!
    i am bob.
    

    危险操作

    1、清空文件的操作

    [root@centos7 ~]# cat win.txt 
    abc
    def[root@centos7 ~]# cat < win.txt > win.txt
    [root@centos7 ~]# cat win.txt 
    [root@centos7 ~]# ll win.txt 
    -rw-r--r--. 1 root root 0 7月  25 14:18 win.txt
    
    

    2、更危险的操作:秒级生成巨大文件

    win.txt如果为空不会有任何事,如果win.txt不为空,就麻烦了,执行不到1s我便CTRL+C

    [root@centos7 ~]# echo 1 > win.txt 
    [root@centos7 ~]# ll win.txt 
    -rw-r--r--. 1 root root 2 7月  25 14:19 win.txt
    [root@centos7 ~]# cat < win.txt >> win.txt
    ^C
    [root@centos7 ~]# ll win.txt 
    -rw-r--r--. 1 root root 990436 7月  25 14:19 win.txt
    
    

    • passwd输出的内容无法重定向到文件

    标准I/O和管道

    seq

    • seq打印1到100: seq 100
    • seq打印2到23: seq 2 23
    • seq打印1到100内的奇数 seq 1 2 100
    • seq打印1到100内的偶数 seq 2 2 100
    • 100以内 ,从1开始,每隔5步打印一个数 seq 1 5 100
    • 100以内 ,从1开始,每隔6步打印一个数 seq 1 6 100
    • 100以内 ,从1开始,每隔6步打印一个数,分隔符为+ seq -s'+' 1 6 100
    • 100以内 ,从1开始,每隔6步打印一个数,分隔符为* seq -s'*' 1 6 100
    • 计算1+7+13+19+...+97的和 seq -s'*' 1 6 100 | bc

    管道加重定向

    2>&1 | 等于 |& 表示如果有错就重定向到标准输出

    [root@centos7 ~]# cat /etc/fst | tr [a-z] [A-Z]
    cat: /etc/fst: 没有那个文件或目录
    [root@centos7 ~]# cat /etc/fst 2>&1 | tr [a-z] [A-Z]
    CAT: /ETC/FST: 没有那个文件或目录
    [root@centos7 ~]# cat /etc/fst |& tr [a-z] [A-Z]
    CAT: /ETC/FST: 没有那个文件或目录
    

    巧用bc加管道,将十进制转化为二进制

    [root@centos7 ~]# echo "obase=2;12" | bc
    1100
    [root@centos7 ~]# echo "obase=2;127" | bc
    1111111
    

    巧妙生成随机数密码

    1、使用tr命令加随机数生成设备urandom

    [root@centos7 ~]# cat /dev/urandom | tr -dc 'a-zA-Z0-9' | head -c20
    uqst41VFGIDrwmusM1k2[root@centos7 ~]#
    

    2、使用openssl

    [root@centos7 ~]# openssl rand -base64 20
    ihgyRWEJscwOj7Gm82ZYElBcxm4=
    

    管道中的 - 符号

    可以表示一个输入或输出流

    比如

    1、https://raw.githubusercontent.com/uscwifi/scripts/master/nginx-install.sh是一个脚本,如果想在本地执行该脚本,一般需要下载下来。下面方法为curl访问到脚本的内容,bash -表示将curl的输出流作为自己的参数

    [root@centos7 ~]# curl https://raw.githubusercontent.com/uscwifi/scripts/master/nginx-install.sh | bash -
    

    2、打包文件

    tar -cvf - /etc表示将/etc目录打包,-为输出流,不写文件名;tar -xvf - 表示解压文件,-将管道前面的输出流作为自己的输入流;-C /tmp表示解压到/tmp目录

    [root@centos7 ~]# tar -cvf  - /etc |tar -xvf - -C /tmp
    

    用户、组和权限

    用户ID分配

    • CentOS6系统用户分配的ID范围为1-499
    • CentOS7系统用户分配的ID范围为1-999
    • CentOS6普通登陆用户分配的ID范围为500+
    • CentOS7普通登陆用户分配的ID范围为1000+

    windows命令创建和删除用户(了解即可)

    • net user root root /add
    • net user root /del

    用户和组相关配置文件

    • /etc/passwd
    • /etc/group
    • /etc/shadow
    • /etc/gshadow

    /etc/passwd的7个字段(了解即可)

    用户名:密码:UID:GID:注释说明:家目录:SHELL

    /etc/shadow的9个字段(了解即可)

    用户名:加密了的密码:最后一次更改密码的日期:密码的最小年龄:密码最大年龄:密码警告时间段:密码禁用期:账户过期日期,保留字段

    getent查看用户信息的强大

    1、查看qqq用户的passwd文件记录

    [root@centos7 ~]# getent passwd qqq
    qqq:x:1000:1000:qqqq,it,10010,10086:/home/qqq:/bin/bash
    

    2、查看qqq用户的group文件记录

    [root@centos7 ~]# getent group qqq
    qqq:x:1000:qqq
    

    3、查看qqq用户的shadow

    [root@centos7 ~]# getent shadow qqq
    qqq:$6$yb2wPd/6dOY1ELLQ$M0DwUcC0XrYNDGPb.cgXBhZ4H7PLzFeO.Us1NrNPqLYgB.8ybFfxBNgqYKBLzFhScG7iK1YvcQ7XyItd6qai9.::0:99999:7:::
    

    chage命令可以更改用户密码过期信息

    finger查看用户信息

    [root@centos7 ~]# finger qqq
    Login: qqq            			Name: qqqq
    Directory: /home/qqq                	Shell: /bin/bash
    Office: it, x1-0010			Home Phone: x1-0086
    Last login 四 7月 25 14:16 (CST) on pts/6
    Mail last read 四 7月 25 14:17 2019 (CST)
    No Plan.
    

    usermod改用户属性

    • useradd可以创建用户
    • usermod -L锁用户,-U解锁用户
    • groupadd用于添加一个组,比较少用
    • 每个用户创建后属于和自己同名的组

    给qqq用户添加附加组wheel

    usermod -aG添加附加组不影响原来的组

    [root@centos7 ~]# id qqq
    uid=1000(qqq) gid=1000(qqq) 组=1000(qqq)
    [root@centos7 ~]# usermod -aG wheel qqq
    [root@centos7 ~]# id qqq
    uid=1000(qqq) gid=1000(qqq) 组=1000(qqq),10(wheel)
    

    把qqq从所有附加组中国移除

    附加组为空即可

    [root@centos7 ~]# id qqq
    uid=1000(qqq) gid=1000(qqq) 组=1000(qqq),10(wheel)
    [root@centos7 ~]# usermod -G '' qqq
    [root@centos7 ~]# id qqq
    uid=1000(qqq) gid=1000(qqq) 组=1000(qqq)
    

    修改密码的几种方式

    1、passwd 交互式改密码
    2、passwd --stdin
    [root@centos7 ~]# echo 123456 | passwd --stdin wang
    更改用户 wang 的密码 。
    passwd:所有的身份验证令牌已经成功更新。
    
    3、chpasswd批量改密码
    [root@centos7 ~]# cat passwd.list 
    wang:123456
    zhang:1234567
    [root@centos7 ~]# cat passwd.list | chpasswd 
    

    4、echo加管道加passwd

    [root@centos7 ~]# echo -e "12345678
    12345678" | passwd zhang
    更改用户 zhang 的密码 。
    新的 密码:无效的密码: 密码未通过字典检查 - 过于简单化/系统化
    重新输入新的 密码:passwd:所有的身份验证令牌已经成功更新。
    

    杂七杂八命令(少用)

    • grpck:group check;检查组文件的完整性
    • vipw,vigr 编辑密码、组、影子密码或影子组文件
    • chfn 修改你的finger信息
    • chsh 修改用户的shell,一般可以创建系统用户并修改其shell为/sbin/nologin,禁止其登陆
  • 相关阅读:
    [转]ExtJs 中 xtype 与组件类的对应表
    [转]通过命令行处理图形
    Windows下删除.svn文件夹的最简易方法
    tomcat 设置缓存大小
    二月份的精选奇趣网站(收藏轉)
    stage.focus
    利用键盘按键操控地图
    flash 随机函数
    flash as 3.0 制作一个旋转 影片剪辑
    in关键字的使用
  • 原文地址:https://www.cnblogs.com/uscWIFI/p/11244743.html
Copyright © 2020-2023  润新知