• Linux常用命令


    1 Linux 命令行介绍

    1. Linux Shell 简介

    Shell 的意思是“外壳”,在 Linux 中它是一个程序,比如/bin/sh、/bin/bash 等。它负责接收用户的输入,根据用户的输入找到其他程序并运行。比如我们输入“ls”并回车时,shell 程序找到“ls”程序并运行,把结果打印出来。
    Shell 有很多种实现,我们常用 bash。

    2. Linux 命令的提示符

    Ubuntu 中打开终端后,即可看到类似下图的提示符:
    在这里插入图片描述

    提示符中各项含义在上图中都列出来了。

    3. Linux 命令的格式

    Linux 命令一般由三部分组成:
    ① command 命令
    ② options 选项
    ③ parameter 参数
    在这里插入图片描述

    说明:
    ① [ ]中括号表示 该部分可选,可有可无,需要根据命令的实际需要而添加
    ② 命令、选项、参数都以空格分隔,不管几个空格都算一个空格
    ③ 命令输入完毕后,按回车“Enter”键启动
    示例:
    在这里插入图片描述

    4. 记住命令并不难, 先背几个单词

    在这里插入图片描述

    5. 绝对路径和相对路径

    Linux 下的根目录为“/”,从根目录下出发可以找到任意目录、任意文件。从根目录开始表示目录或文件的方法称为“绝对路径”。比如:

    /home/book
    /home/book/1.txt
    /bin/pwd
    
    • 1
    • 2
    • 3

    有时候使用绝对路径太过麻烦,可以使用相对路径。假设当前正位于/home/book 目录下,那么:

    ./1.txt 表示当前目录下的 1.txt,即 /home/book/1.txt;“.”表示当前目录
    ../book/1.txt 表示当前目录的上一级目录里,book 子目录下的 1.txt
     “/home/book/..”就是”/home”目录,”..”表示上一级目录
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    2 目录/文件操作命令

    1. pwd

    在这里插入图片描述

    2. cd

    在这里插入图片描述
    cd 命令有些缩略用法:

    $ cd - // 进入上次目录, 比如先进入 a 目录再进入 b 目录,执行此命令后即回到 a 目录
    $ cd ~ // 进入家目录
    
    • 1
    • 2

    3. mkdir

    在这里插入图片描述

    4. rmdir

    在这里插入图片描述

    5. ls

    在这里插入图片描述
    使用示例:
    在这里插入图片描述

    6. cp

    在这里插入图片描述
    复制目录时,常用如下命令:

    $ cp -rfd dir_a dir_b
    
    • 1

    r:recursive,递归地,即复制所有文件
    f:force,强制覆盖
    d:如果源文件为链接文件,也只是把它作为链接文件复制过去,而不是复制实际文件

    7. rm

    在这里插入图片描述
    删除目录时,常用如下命令:

    $ rm -rf dir_a
    
    • 1

    r:recursive,递归地,即复制所有文件
    f:force,强制删除

    8. cat

    在这里插入图片描述

    9. touch

    在这里插入图片描述

    3 改变文件的权限和属性

    chgrp:改变文件所属用户组
    chown:改变文件所有者
    chmod:改变文件的权限

    1. chgrp

    改变文件所属用户组

    chgrp 【-R】 dirname/filename ...
    
    • 1

    -R : 进行递归的持续更改,也连同子目录下的所有文件、目录都更新成为这个用户组之意。常常用在更改某一目录内所有文件的情况。
    范例:

    chgrp hy install.log
    
    • 1

    将 install.log 文件的用户组改为 hy 用户组。注意 hy 用户组必须要在/etc/group 文件内存在才可以。

    2. chown

    改变文件的所有者

    chown [-R] 账号名 文件或目录
    chown [-R] 账号名:组名 文件或目录
    
    • 1
    • 2

    -R:也是递归子目录。
    范例:

    chown bin install.log
    chown book:book install.log
    
    • 1
    • 2

    改变文件所有者和用户组的这两个命令的应用场景:复制文件,由于复制行为会复制执行者的属性和权限,因此复制后需要改变文件所属用户、用户组等。

    3. chmod

    改变文件的权限
    文件权限有两种设置方法:数字类型改变权限和符号改变权限。
    首先说明各个权限对应的数字:
    ① r: 4 或 0
    ② w: 2 或 0
    ③ x: 1 或 0
    这 3 种权限的取值相加后,就是权限的数字表示。
    例如:文件 a 的权限为“-rwxrwx—”,它的数值表示为:
    ① owner = rwx = 4+2+1 = 7
    ② group = rwx = 4+2+1 = 7
    ③ others = — = 0+0 +0 = 0
    所以在设置权限时,该文件的权限数字就是 770。使用数值改变文件权限的命令如下:

    chmod [-R] xyz 文件或目录
    
    • 1

    ① xyz : 代表权限的数值,如 770。
    ② -R : 以递归方式进行修改,比如修改某个目录下所有文件的属性。
    范例:

    chmod 777 .bashrc
    
    • 1

    将文件.bashrc 这个文件的所有权限设置都启用。
    2) 符号类型改变文件权限方式
    使用 u、g、o 三个字母代表 user、group、others 3 中身份。此外 a 代表 all,即所有身份。
    范例:

    chmod u=rwx,go=rx .bashrc
    
    • 1

    也可以增加或去除某种权限,“+”表示添加权限,“-”表示去除权限:

    chmod a+w .bashrc
    chmod a-x .bashrc
    
    • 1
    • 2

    4 查找/搜索命令

    1. find

    在 Windows 中搜索文件,一般查找文件需要传入两个条件:
    a. 在哪些目录中查找;
    b. 查找的内容;
    在 Linux 中,查找文件的也需要这两个条件,不同于 Windows 使用搜索框查找,Linux 中使用 find 命令查找文件。
    find 命令格式为:

    find 目录名 选项 查找条件
    
    • 1

    举例 1:

    $ find /home/book/dira/ -name " test1.txt " 
    
    • 1

    说明:
    a) /home/book/dira/指明了查找的路径。
    b)“-name”表明以名字来查找文件 。
    c)“test1.txt”,就指明查找名为“test1.txt”的文件。
    举例 2:

    $ find /home/book/dira/ -name " *.txt " 
    
    • 1

    说明: 查找指定目录下面所有以“.tx”t 结尾的文件,其中“*”是通配符。
    举例 3:

    find /home/book/dira/ -name "dira"
    
    • 1

    说明: 查找指定目录下面是否存在“dira”这个目录或文件,“dira”是名称。
    注意:
    ① 如果没有指定查找目录,则为当前目录。

    $ find . -name " *.txt " //其中.代表当前路径。
    $ find -name " *.txt " //没加路径,默认是当前路径下查找。
    
    • 1
    • 2

    ② find 还有一些高级的用法,如查找最近几天(几个小时)之内(之前)有变动的文件

    $ find /home/book -mtime -2 //查找/home目录下两天内有变动的文件。
    
    • 1

    2. grep

    grep 命令的作用是查找文件中符合条件的字符串,其格式如下:

    grep [选项] [查找模式] [文件名]
    • 1

    假设 dira 目录的 test1.txt 和 dirb 目录的 test1.txt 都含有如下内容: aaa AAAAAA abc abcabcabc cbacbacba match_pattern nand->erase。
    通过查找字符串,希望显示如下内容:
    1)所在的文件名----grep 查找时默认已经显示目标文件名
    2)所在的行号------使用-n 选项。
    grep -rn “字符串” 文件名 r(recursive):递归查找 n(number):显示目标位置的行号 字符串:要查
    找的字符串 文件名:要查找的目标文件,如果是*则表示查找当前目录下的所有文件和目录。
    举例:

    //在test1.txt中查找字符串abc grep -rn "abc" * 在当前目录递归查找字符串abc
    $ grep -n "abc" test1.txt 
    
    • 1
    • 2

    注意:可以加入-w 全字匹配。
    可以在 grep 的结果中再次执行 grep 搜索,比如搜索包含有 ABC 的头文件,可执行如下命令:

    $ grep “ABC” * -nR | grep “\.h”
    
    • 1

    上述命令把第 1 个命令“grep “ABC” * -nR”通过管道传给第 2 个命令。
    即第 2 个命令在第 1 个命令的结果中搜索。

    5 压缩/解压命令

    压缩的目的: 在网络传递文件时,可以先将文件压缩,然后传递压缩后的文件,从而减少网络带宽。
    接收到文件后,解压即可。
    压缩的类型有 2 种:有损压缩、无损压缩:
    a. 有损压缩:
    如 mp4 视频文件,在压缩过程中减少了很多帧的数据,但是对观看者而言没有影响。当然 mp3 音乐文件也是有损压缩。
    b. 无损压缩:
    如普通文件的压缩,为了保证信息的正确传递,不希望文件经过压缩或解压后,出现任何差异。后面讲解的都是无损压缩。
    单个文件的压缩(解压)使用 gzip 和 bzip2 ,多个文件和目录使用 tar。

    1. gzip

    gzip 的常用选项:

    -l(list) 列出压缩文件的内容。
    -k(keep) 在压缩或解压时,保留输入文件。
    -d(decompress) 将压缩文件进行解压缩。
    
    • 1
    • 2
    • 3

    举例:
    1) 查看压缩文件

    $ gzip -l pwd.1.gz
    
    • 1

    2) 解压文件

    $ gzip -kd pwd.1.gz //该压缩文件是以.gz结尾的单个文件
    
    • 1

    3) 压缩文件

    $ gzip -k mypwd.1 /得到了一个.gz结尾的压缩文件
    
    • 1

    注意:
    1)如果 gzip 不加任何选项,此时为压缩
    压缩完该文件会生成后缀为.gz 的压缩文件,并删除原来的文件。
    所以,推荐使用 gzip -k 来压缩源文件,这样会保留原来的文件。
    2)相同的文件内容,如果文件名不同,压缩后的大小也不同。
    3)gzip 只能压缩单个文件,不能压缩目录。

    2. bzip2

    bzip2 的常用选项:

    -k(keep) 在压缩或解压时,保留输入文件;
    -d(decompress) 将压缩文件进行解压缩;
    
    • 1
    • 2

    1) 压缩文件

    $ bzip2 -k mypwd.1 得到一个.bz2后缀的压缩文。
    
    • 1

    2) 解压文件

    $ bzip2 -kd mypwd.1.bz2
    
    • 1

    注意:
    1)如果 bzip2 不加任何选项,此时为压缩
    压缩完该文件会生成后缀为.bz2 的压缩文件, 并删除原来的文件。
    所以说,推荐使用 bzip2 -k 来压缩文件,这样可以保留原来的文件。
    2)bzip2 只能压缩单个文件,不能压缩目录。
    单个文件的压缩使用 gzip 或 bzip2, 压缩有两个参数:
    1)压缩时间
    2)压缩比。
    一般情况下,小文件使用 gzip 来压缩,大文件使用 bzip2 来压缩。bzip2 的的压缩率更高。

    3. tar

    tar 常用选项:

    -c(create):表示创建用来生成文件包 。
    -x:表示提取,从文件包中提取文件。
    -t:可以查看压缩的文件。
    -z:使用gzip方式进行处理,它与”c“结合就表示压缩,与”x“结合就表示解压缩。
    -j:使用bzip2方式进行处理,它与”c“结合就表示压缩,与”x“结合就表示解压缩。
    -v(verbose):详细报告tar处理的信息。
    -f(file):表示文件,后面接着一个文件名。 -C <指定目录> 解压到指定目录。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    例 1:tar 打包、gzip 压缩
    1)把目录 dira 压缩、打包为 dira.tar.gz 文件:

    $ tar czvf dira.tar.gz dira。
    
    • 1

    注意:“tar –czvf”与“tar czvf”是一样的效果,所以说,后面统一取消“-”。
    2)查看压缩文件:

    $ tar tvf dira.tar.gz
    
    • 1

    3) 解压文件,可以用-C 指定解压到哪个目录:

    $ tar xzvf dira.tar.gz //解压到当前目录
    $ tar xzvf dira.tar.gz -C /home/book //解压到/home/book。
    
    • 1
    • 2

    例 2:tar 打包、bzip2 压缩
    1)把目录 dira 压缩、打包为 dira.tar.bz2 文件

    $ tar cjvf dira.tar.bz2 dira
    
    • 1

    2)查看压缩文件

    $ tar tvf dira.tar.bz2
    
    • 1

    3)解压文件,可以用-C 指定解压到哪个目录

    $ tar xjvf dira.tar.bz2 //解压到当前目录: 
    $ tar xjvf dira.tar.bz2 -C /home/book //解压到/home/book
    
    • 1
    • 2

    6 网络命令

    1. ifconfig

    查看网络、设置 IP。ifconfig 常用选项:

    -a :显示所有网卡接口
    up:激活网卡接口
    down:关闭网卡接口
    address:xxx.xxx.xxx.xxx,IP地址
    
    • 1
    • 2
    • 3
    • 4

    示例:
    1)ifconfig:查看当前正在使用的网卡

    $ ifconfig
    ens160: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
     inet 192.168.1.137 netmask 255.255.255.0 broadcast 192.168.1.255
     inet6 fe80::4f45:59fb:ddb7:c274 prefixlen 64 scopeid 0x20<link>
     ether 00:0c:29:ab:1d:05 txqueuelen 1000 (Ethernet)
     RX packets 998794 bytes 176687882 (176.6 MB)
     RX errors 0 dropped 0 overruns 0 frame 0
     TX packets 801210 bytes 138020387 (138.0 MB)
     TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    2)ifconfig -a:查看所有网卡

    $ ifconfig -a
    ens160: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
     inet 192.168.1.137 netmask 255.255.255.0 broadcast 192.168.1.255
     inet6 fe80::4f45:59fb:ddb7:c274 prefixlen 64 scopeid 0x20<link>
     ether 00:0c:29:ab:1d:05 txqueuelen 1000 (Ethernet)
     RX packets 998889 bytes 176699569 (176.6 MB)
     RX errors 0 dropped 0 overruns 0 frame 0
     TX packets 801287 bytes 138033739 (138.0 MB)
     TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
    lo: flags=8<LOOPBACK> mtu 65536
     inet 127.0.0.1 netmask 255.0.0.0
     loop txqueuelen 1000 (Local Loopback)
     RX packets 51460 bytes 3249553 (3.2 MB)
     RX errors 0 dropped 0 overruns 0 frame 0
     TX packets 51460 bytes 3249553 (3.2 MB)
     TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    1. 设置网 IP:
    $ sudo ifconfig ens160 192.168.1.137
    
    • 1

    2. route 和 DNS

    确保 Windows 和 Ubuntu 的网络能互相 ping 通之后,如果 Ubuntu 无法上网,原因通常有 2 个:路由没设置好,DNS 没设置好。
    如果执行以下命令不成功,表示路由没设置好:

    $ ping 8.8.8.8
    connect: Network is unreachable
    
    • 1
    • 2

    如果“ping 8.8.8.8”成功,但是“ping www.baidu.com”不成功,则是 DNS 没设置好:

    $ ping www.baidu.com
    ping: unknown host www.baidu.com
    
    • 1
    • 2

    DNS 的设置比较简单,8.8.8.8 是好记好用的 DNS 服务器,修改 Ubuntu 中的/etc/resolv.conf 文件,内容如下:

    nameserver 8.8.8.8
    
    • 1

    假设某主机上的网络接口配置和路由表如下:

    $ ifconfig
    eth0 Link encap:Ethernet HWaddr 00:0C:29:C2:8D:7E
     inet addr:192.168.10.223 Bcast:192.168.10.255 Mask:255.255.255.0
     UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
     RX packets:0 errors:0 dropped:0 overruns:0 frame:0
     TX packets:10 errors:0 dropped:0 overruns:0 carrier:0
     collisions:0 txqueuelen:100
     RX bytes:0 (0.0 b) TX bytes:420 (420.0 b)
     Interrupt:10 Base address:0x10a0
    eth1 Link encap:Ethernet HWaddr 00:0C:29:C2:8D:88
     inet addr:192.168.56.136 Bcast:192.168.56.255 Mask:255.255.255.0
     UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
     RX packets:603 errors:0 dropped:0 overruns:0 frame:0
     TX packets:110 errors:0 dropped:0 overruns:0 carrier:0
     collisions:0 txqueuelen:100
     RX bytes:55551 (54.2 Kb) TX bytes:7601 (7.4 Kb)
     Interrupt:9 Base address:0x10c0
    lo Link encap:Local Loopback 
     inet addr:127.0.0.1 Mask:255.0.0.0
     UP LOOPBACK RUNNING MTU:16436 Metric:1
     RX packets:37 errors:0 dropped:0 overruns:0 frame:0
     TX packets:37 errors:0 dropped:0 overruns:0 carrier:0
     collisions:0 txqueuelen:0 
     RX bytes:3020 (2.9 Kb) TX bytes:3020 (2.9 Kb)
    $ route
    Kernel IP routing table
    Destination Gateway Genmask Flags Metric Ref Use Iface
    192.168.10.0 * 255.255.255.0 U 0 0 0 eth0
    192.168.56.0 * 255.255.255.0 U 0 0 0 eth1
    127.0.0.0 * 255.0.0.0 U 0 0 0 lo
    default 192.168.10.1 0.0.0.0 UG 0 0 0 eth0
    
    • 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

    上述 route 命令输出信息中各项的含义请看下:

    Destination 目标网段或者主机
    Gateway   	网关地址,”*” 表示目标是本主机所属的网络,不需要路由
    Genmask  	网络掩码
    
    • 1
    • 2
    • 3
    Flags         标记。一些可能的标记如下:
    					U - 路由是活动的
    					H - 目标是一个主机
    					G - 路由指向网关
    					R - 恢复动态路由产生的表项
    					D - 由路由的后台程序动态地安装
    					M - 由路由的后台程序修改
    					! - 拒绝路由
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    在上面的例子中,这台主机有两个网络接口:
    ① 一个网络接口连到 192.168.10.0/24 网络
    ② 另一个网络接口连到 192.168.56.0/24 网络。
    如果要发送的数据包的目的地址是 192.168.56.3,跟第一行的子网掩码做与运算得到 192.168.56.0,与第一行的目的网络地址不符,再跟第二行的子网掩码做与运算得到 192.168.56.0,正是第二行的目的网络地址,因此从 eth1 接口发送出去,由于 192.168.56.0/24 正是与 eth1 接口直接相连的网络,因此可以直接发到目的主机,不需要经路由器转发。
    如果要发送的数据包的目的地址是 202.10.1.2,跟前三行路由表条目都不匹配,那么就要按缺省路由条目,从 eth0 接口发出去,首先发往 192.168.10.1 路由器,再让路由器根据它的路由表决定下一跳地址。
    可以使用 route 命令管理路由。
    示例:
    1)添加路由:首先得确定网关 IP,假设为 192.168.1.1

    $ sudo route add default gw 192.168.1.1
    $ ping 8.8.8.8 // 验证
    PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
    64 bytes from 8.8.8.8: icmp_seq=1 ttl=53 time=19.8 ms
    64 bytes from 8.8.8.8: icmp_seq=3 ttl=53 time=19.8 ms
    
    • 1
    • 2
    • 3
    • 4
    • 5

    2)删除路由:

    $ sudo route del default gw 192.168.1.1
    
    • 1

    7 vi 编辑器

    vi 是一个命令,也是一个命令行下的编辑器,它有如下功能:
    a. 打开文件、新建文件、保存文件
    b. 光标移动
    c. 文本编辑
    d. (多行间|多列间)复制、粘贴、删除
    e. 查找和替换
    很多人不习惯在命令行下编辑文件,实际开发中也不会经常在命令行下编辑文件。但是在 Linux 系统中对文件做些简单修改时,使用 vi 命令的效率非常高。并且在很多时候,比如现场调试时,并没有 GUI 形式的编辑工具,vi 是唯一选择。

    1. 模式

    vi 编辑器有三种模式,各个模式侧重点不一样:
    a. 一般模式(光标移动、复制、粘贴、删除)
    b. 编辑模式(编辑文本)
    c. 命令行模式(查找和替换)
    vi 编辑器的三种模式间切换如下图所示
    在这里插入图片描述
    注意:
    a. 当不知道处于何种模式时,按 ESC 键返回到一般模式。
    b. wq(write quit)
    c. i(insert)

    2. 文件的打开、新建、保存

    打开文件、新建文件,命令如下(如果文件存在则打开文件,否则新建文件并打开):

    $ vi 文件名
    
    • 1

    修改结束之后,输入“:” 进入命令行模式,再输入“wq”保存退出:

    :wq 保存并退出文件
    
    • 1

    注意:如果文件不存在,也需要输入“:wq”才可以保存新文件,否则不会新建文件。

    在编辑完成时,返回一般模式,方法如下:
    a. 输入“:w”则保存文件,如果已经保存文件,输入“:q”则退出文件
    b. 直接输入“:wq”保存并退出
    c. 如果不想保存被修改的内容,则输入“:q!”强制退出。
    这些命令如下:
    命令 描述

    x     保存当前文档并且退出。
    q     退出。
    w     保存文档 。
    q!    退出 vi/vim,不保存文档。
    
    • 1
    • 2
    • 3
    • 4

    3. 编辑文件

    打开文件后,默认处于“一般模式”,这时可以输入以下字母:

    指令   	描述
    i     	在当前光标所在字符的前面,转为编辑模式。
    I 	  	在当前光标所在行的行首转换为编辑模式。
    a 		在当前光标所在字符的后面,转为编辑模式。
    A 		在光标所在行的行尾,转换为编辑模式。
    o 		在当前光标所在行的下方,新建一行,并转为编辑模式。
    O 		在当前光标所在行的上方,新建一行,并转为编辑模式。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    4. 快速移动光标

    在一般模式下,可以使用下面快捷键移动光标或是翻页:
    移动光标

    h (或左方向键) 光标左移一个字符。
    l (或右方向键) 光标右移一个字符。
    j (或下方向键) 光标下移一行。
    k (或上方向键) 光标上移一行。
    nG 或 ngg 光标移动到第 n 行首。
    n+ 光标下移 n 行。
    n- 光标上移 n 行。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    屏幕翻滚

    Ctrl + f 屏幕向下翻一页,相当于下一页。
    Ctrl + b 屏幕向上翻一页,相当于上一页。
    
    • 1
    • 2

    详细介绍如下:
    1)快速的定位到某一行:文件头、文件尾、指定某一行

    ngg //光标移至第n行的行首(n为数字,想要跳转的行),
    1gg //就跳到第一行的行首,就是文件头
    2gg //就跳到第二行的行首
    G //转至文件结尾
    
    • 1
    • 2
    • 3
    • 4

    2)在某一行如何快速定位到某一列:

    0 //(数字零)光标移至当前行行首
    $ //光标移至当前行行末
    fx //搜索当前行中下一个出现字母x的地方
    
    • 1
    • 2
    • 3

    注意:当你不知道 vi 当前处于何种模式时,使用 esc 键返回到一般模式。

    5. 文本复制、粘贴、删除、撤销

    在一般模式下,可以执行以下命令。
    复制、删除和粘贴

    cc 		删除整行,并且修改整行内容。
    dd 		删除该行,不提供修改功能。
    ndd 	删除当前行向下 n 行。
    x 		删除光标所在的字符。
    X 		删除光标前面的一个字符。
    nyy 	复制当前行及其下面 n 行。
    p 		粘贴最近复制的内容。
    s 		删除光标所在字符。
    r 		替换光标处字符。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    1. 复制
    yy //复制当前行(y:yank(复制)) 
    nyy //复制当前行及其后的n-1行(n是数字)
    
    • 1
    • 2
    1. 粘贴
    p //粘贴(p:paste)
    
    • 1
    1. 删除
    dd //删除光标所在行(d:delete)
    ndd //删除当前行及其后的n-1行(n是数字)
    x //删除光标所在位置的字符
    
    • 1
    • 2
    • 3
    1. 撤销
    u //撤销上一步操作
    
    • 1
    1. 文本查找和替换
      在一般模式下,可以执行以下命令。
    1. 查找
    /pattern //从光标开始处向文件尾搜索pattern,后按下n或N
    
    • 1

    注意:

    n 在同一个方向重复上一次搜索命令
    N 在反方向重复上一次搜索命令
    
    • 1
    • 2

    注意:
    在/pattern 之前先跳到第一行则进行全文件搜索。
    2) 替换

    :%s/p1/p2/g //将文件中所有的p1均用p2替换
    :%s/p1/p2/gc //替换时需要确认
    
    • 1
    • 2

    “s“ 全称:substitute 替换;
    “g“ 全称:global 全局;
    “c“ 全称:confirm,确认
    7. vi 编辑器使用示例
    本例创建一个名为 hello.txt 的文件,添加如下 2 行文件字,再回退去删除第 2 行的字母“X”:

    www.100ask.net
    wiki.100askX.net
    
    • 1
    • 2

    首先执行以下命令,如果当前目录下没有 hello.txt 它就会新建并打开该文件,否则直接打开该文件:

    vi hello.txt
    
    • 1

    界面如下:
    在这里插入图片描述
    输入字符“i”,它表示“insert”,即在光标前输入字符,界面如下:
    在这里插入图片描述
    在上述界面中,可以输入字符了,可以使用回车键、删除键、箭头键等等,跟一般得文本工具没什么差别,如下:
    在这里插入图片描述
    无论当前是否处于编辑模式,都可以使用箭头键移动光标。
    在编辑模式下,使用删除键(Backspace)删除字符。
    不在编辑模式下时,使用“x”删除光标所在的字符,如下:
    在这里插入图片描述
    最后输入“:wq”保存并退出,“:”表示进入命令行模式,“wq”表示“write and quit”,即写入并退出。如果不想保存则可以输入“:q!”,它表示“退出、不保存”。
    在这里插入图片描述
    最后执行“cat hello.txt”命令验证一下:
    在这里插入图片描述

    8 其他命令

    1. file

    查看文件类型。其格式如下:

    file 文件名
    
    • 1

    使用 gcc 编译得到的程序是运行于 PC 的,但是很多初学者经常把这些程序放到 ARM 板子上去运行,这时一般都会提示:

    xxx not found
    
    • 1

    它并非“找不到”,而是格式不正确。
    这时你可以执行“file xxx”查看它的类型,确定它是给 PC 还是给 ARM 编译的。

    2. which 和 whereis

    which 命令和 whereis 命令作用是查找命令或应用程序的所在位置,其格式如下:

    which 命令名/应用程序名
    whereis 命令名/应用程序名。
    
    • 1
    • 2

    示例:

    $ which pwd //定位到/bin/pwd
    $ which gcc //定位到/usr/bin/gcc
    $ whereis pwd //可得到可执行程序的位置和手册页的位置
    
    • 1
    • 2
    • 3
  • 相关阅读:
    Android网络请求(2)
    Flutter ☞ 常量
    puzzle(019.3)Colors United、染色棋盘
    redis集群系列二
    ​软考-高级-系统架构设计师教程(清华第2版)【第20章 系统架构设计师论文写作要点(P717~728)-思维导图】​
    算法通关村第16关【白银】| 滑动窗口经典问题
    「案例分享」DevExpress XAF (WinForms UI)赋能医疗管理系统,让操作更自动化!
    从Unreal的Cast函数探寻反射系统父子关系的建立过程
    BCC源码内容概览(5)
    【数据结构】详解链表结构
  • 原文地址:https://blog.csdn.net/weixin_48856218/article/details/132796588