zoukankan      html  css  js  c++  java
  • 第五天、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,禁止其登陆
  • 相关阅读:
    「UVA12293」 Box Game
    「CF803C」 Maximal GCD
    「CF525D」Arthur and Walls
    「CF442C」 Artem and Array
    LeetCode lcci 16.03 交点
    LeetCode 1305 两棵二叉搜索树中的所有元素
    LeetCode 1040 移动石子直到连续 II
    LeetCode 664 奇怪的打印机
    iOS UIPageViewController系统方法崩溃修复
    LeetCode 334 递增的三元子序列
  • 原文地址:https://www.cnblogs.com/uscWIFI/p/11244743.html
Copyright © 2011-2022 走看看