• [Linux系统] (1)常用操作(CentOS 7.x)


    一、Linux系统配置

    1.修改主机名 [/etc/hostname]

    vi /etc/hostname

    在其中将旧名字修改为新主机名,保存,重启生效。

    2.本地DNS映射 [/etc/hosts]

    vi /etc/hosts

    添加ip-name对:

    192.168.1.121 centos-clone1

    保存即可。

    3.查看命令信息 [type][file]

    type ifconfig

    得到信息:

    ifconfig is /usr/sbin/ifconfig

    说明ifconfig位于/usr/sbin目录下。

    继续查看该命令的类型:

    file /usr/sbin/ifconfig

    得到以下内容:

    /usr/sbin/ifconfig: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=22d5b3be8d3ce3c71cad5b982581ede262397b56, stripped

    注意ELF,表示这是一个二进制文件的编码格式,说明是一个可执行的二进制文件。

    我们再看看yum的类型:

    file /usr/bin/yum
    /usr/bin/yum: Python script, ASCII text executable

    说明yum是一个python脚本。

    再看看cd的类型:

    type cd
    cd is a shell builtin

    cd是一个shell的内建程序。

    4.环境变量PATH

    打印环境变量:

    echo $PATH

    在PATH环境变量中,我们需要将软件的可执行程序目录(一般是bin)添加进去。例如:

    /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

    这是系统默认添加在PATH环境变量中的目录,假设我们安装了JDK,则需要将JDK下的bin目录也添加进去,这样我们就可以直接使用java、javac等命令。

    5.补全mini系统中的帮助工具man

    在Mini版的系统中,可能确实man工具或man不完整,通过yum安装完整版的man:

    yum install man man-pages -y

    6.命令的学习帮助 [help][man]

    命令分为内部命令和外部命令

    内部命令就是shell的内建命令,例如cd、type等。内部命令通过help来学习:

    help cd

    外部命令就是我们安装的命令,例如ifconfig等。外部命令通过man来学习:

    man ifconfig

    二、Linux基本操作

    1.查看磁盘信息 [df]

    [root@centos-clone1 etc]# df
    Filesystem              1K-blocks    Used Available Use% Mounted on
    devtmpfs                  1918600       0   1918600   0% /dev
    tmpfs                     1930676       0   1930676   0% /dev/shm
    tmpfs                     1930676   11688   1918988   1% /run
    tmpfs                     1930676       0   1930676   0% /sys/fs/cgroup
    /dev/mapper/centos-root  18307072 1489260  16817812   9% /
    /dev/sda1                  508588  168500    340088  34% /boot
    tmpfs                      386136       0    386136   0% /run/user/0

    转换为人类可读:

    [root@centos-clone1 etc]# df -h
    Filesystem               Size  Used Avail Use% Mounted on
    devtmpfs                 1.9G     0  1.9G   0% /dev
    tmpfs                    1.9G     0  1.9G   0% /dev/shm
    tmpfs                    1.9G   12M  1.9G   1% /run
    tmpfs                    1.9G     0  1.9G   0% /sys/fs/cgroup
    /dev/mapper/centos-root   18G  1.5G   17G   9% /
    /dev/sda1                497M  165M  333M  34% /boot
    tmpfs                    378M     0  378M   0% /run/user/0

    在这里我们可以看到,磁盘使用了LVM,根目录存在于卷组centos(VG)上得逻辑卷root(LV)上,大小为18G。

    但是根下面的boot目录是独立存放在sda1物理卷上的。

    2.文件系统目录

    /bin  #一般存放系统命令
    /sbin  #一般存放系统命令
    /boot  #引导文件
    /dev  #I/O设备抽象成文件
    /etc  #配置
    /home  #非root用户家目录
    /root  #root用户家目录
    /lib  #库文件
    /lib64  #库文件
    /mnt  #挂载点
    /usr  #软件的受管控安装目录
    /var  #软件的生成文件
    /opt  #非受系统管控软件,约定俗成的安装位置

    3.统计各个文件夹大小 [df]

    du -s ./   #统计当前目录大小
    du -s ./*  #统计子目录各自大小

    -s 表示sum即求和。如果使用./则是统计该目录的总大小,如果使用./*则是对该目录下所有子文件夹各自进行统计。

    du -sh

    使用 -h 表示human,以人类可读的方式显示大小:

    [root@centos-clone1 usr]# du -sh ./
    1.1G    ./
    [root@centos-clone1 usr]# du -sh ./*
    58M     ./bin
    0       ./etc
    0       ./games
    36K     ./include
    656M    ./lib
    116M    ./lib64
    12M     ./libexec
    8.0K    ./local
    43M     ./sbin
    231M    ./share
    0       ./src
    0       ./tmp

    注:使用该命令可以检查哪个文件夹占用空间最大,找到磁盘耗尽的祸源。

    4.文件权限

    [root@centos-clone1 boot]# ls -l
    total 134352
    -rw-r--r--  1 root root   152980 Sep 30 22:23 config-3.10.0-1062.1.2.el7.x86_64
    -rw-r--r--. 1 root root   126426 Nov 20  2015 config-3.10.0-327.el7.x86_64
    drwxr-xr-x  3 root root       16 Oct 14 20:48 efi
    drwxr-xr-x. 2 root root       26 Oct 14 17:18 grub
    drwx------. 5 root root     4096 Oct 15 13:20 grub2
    -rw-r--r--. 1 root root 43048490 Oct 14 17:21 initramfs-0-rescue-62ae9a150bf641ba955e242814e7d88a.img
    -rw-------  1 root root 21703346 Oct 14 20:53 initramfs-3.10.0-1062.1.2.el7.x86_64.img

    使用ls -l查看详细文件列表后,我们可以看到一下内容(从前往后):

    文件类型:第一位表示文件类型,d表示文件夹,-表示文件,l表示软连接,b表示字节流设备文件,c表示字符流设备文件等等。

    文件权限:后面的9位每3位为一组,分别表示该用户、用户组、其他用户对该文件的读、写、执行权限。

    Selinux和ACL标志:在权限的后面有一个"."或者"+",这两个符号用来表示有没有Selinux和ACL上下文,与安全有关。

    硬链接数:权限部分后面的数字,表示该文件有多少个硬链接。如果是目录,则表示目录中包含的所有文件的硬链接总和。

    文件所属:中间的root root表示文件所属用户,以及用户组。

    文件大小:如果是文件,则直接显示文件大小,如果是文件夹,则需要通过du来统计大小。

    修改时间:文件最后修改时间。

    文件名称:文件或文件夹名称。

    5.创建目录 [mkdir]

    普通创建:

    mkdir ./abc

    递归创建:

    mkdir -p ./a/b/c

    横向创建:

    mkdir {x,y,z}dir
    [root@centos-clone1 ~]# ls
    abc  anaconda-ks.cfg  xdir  ydir  zdir

    6.删除 [rm]

    删除单文件和空文件夹:

    rm -f filename

    -f 指force即强制删除,无需用户确认。

    删除多层文件夹:

    rm -rf dir

    -r 指递归的删除。

    不要删除根目录:

    rm -rf /

    这样回导致所有根目录下的文件及文件夹被删除,导致系统崩溃,删除后只剩下最初的引导程序grub。

    7.拷贝 [cp]

    拷贝一个文件:

    cp filename /dstdir/newname

    拷贝一个文件夹:

    cp -r dirname newdirname

    8.硬链接和软连接 [ln]

    硬链接:

    ln filename othername

    filename指被硬链接的文件,othername表示创建的硬链接的名字。

    文件被硬链接时,所有的名字都指向同一个文件,类似于java中的引用。

    当删除一个硬链接时,如果还存在该文件的其他硬链接,该文件本身不会被删除,但是硬链接数量减一。

    软链接:

    ln -s filename othername

    -s 表示软链接 soft link。

    软链接实际上就类似于windows中的快捷方式。

    windows下当我们删除原文件时,快捷方式是不被删除的,但是运行该快捷方式会表示找不到原文件。在Linux下同理,我们删除原文件后,该软链接会显红提示原文件找不到。

    当我们删除软链接时,仅仅删除的是快捷方式,是不影响原文件的。

    9.元数据 [stat]

    查看一个文件的元数据(属性):

    [root@centos-clone1 ~]# stat anaconda-ks.cfg 
    File: anaconda
    -ks.cfg Size: 1309 Blocks: 8 IO Block: 4096 regular file Device: fd00h/64768d Inode: 68341593 Links: 1 Access: (0600/-rw-------) Uid: ( 0/ root) Gid: ( 0/ root) Access: 2019-10-14 17:22:21.958249864 +0800 Modify: 2019-10-14 17:22:21.959249872 +0800 Change: 2019-10-14 17:22:21.959249872 +0800 Birth: -

    注意看其中有3个时间,Access、Modify和Change。

    Access:表示最近一次访问该文件的时间。

    Modify:表示最近一次修改该文件内容的时间。

    Change:表示文件元数据最近一次变化的时间。(纯粹的访问该文件不会引起该时间变化,Access时间变化不影响。但是编辑文件则会导致该时间变化,估计是因为Modify时间变化了。)

    10.管道 [|]

    利用管道可以衔接2个命令,将第一命令的输出做为第二个命令的输入。

    head -4 filename | tail -1

    先用head读取file中的前4行,再将这4行交给tail,获取最后一行。相当于获取了file中的第4行。

    echo "/" | ls -l   # 错误

    上面这个命令不能得到根目录的文件列表。因为路径"/"对于ls -l来说是参数,而不是输入。可以改为如下:

    echo "/" | xargs ls -l

    这个命令相当于把"/"这个输出交给xargs命令,而xargs命令会将得到的输入"/"作为ls -l的参数,并运行ls命令。

    11.过滤 [grep]

    从文件中过滤出含有word的行:

    grep word filename

    用-v过滤出不含word的行(反选):

    grep -v word filename

    三、VI编辑器

    1.打开文件

    打开文件,光标定位到第5行:

    vi +5 filename

    打开文件,光标定位到最后一行:

    vi + filename

    或者打开文件后shift + G,光标也是切换到最后一行。

    2.保存&退出

    保存退出:

    :wq
    shift ZZ
    :x

    不保存退出:

    :q!

    3.vi三种模式

    编辑模式:刚打开文件时的模式,即所有的键盘操作都是快捷键,例如i插入,d删除等。

    插入模式:按i、a、o等可以进入插入模式,即键盘从编辑模式恢复正常内容输入功能。

    末行模式:按ESC再按":",可以进入末行模式,此时可以保存退出,或者使用"/"查找,"set nu"(不是set num)显示行号等。

    编辑模式--->插入模式:

    - i :在当前光标的前面转为输入模式,也就是输入的内容插入在光标的前面。
    
    - a:在当前光标的后面转为输入模式,在输入内容时,光标自动会先往后面移动一格,然后再插入在光标之前,可以减少肢体运动,特别是想在一行的最后插入内容。
    
    - I:在当前行的行首转换为输入模式。
    
    - A:当前行的行末转换为输入模式。
    
    - o:在当前行的下面新建一行,并转入输入模式。
    
    - O:在当前行的上面新建一行,并转入输入模式。

    插入模式--->编辑模式:

    ESC

    编辑模式--->末行模式:

    按 :

    末行模式--->编辑模式:

    ESC

    4.编辑模式下的基本操作

    编辑模式下的光标移动:
    在编辑模式下,我们无需使用方向键来移动光标,可以使用以下几个键来进行字符级光标移动:

    - h:左移
    - l:右移
    - j:下移
    - k:上移

    单词间的跳跃:

    - w : 移动至下一个单词词首,即逐单词跳跃
    - e : 移动至当前单词或下一个单词的词尾
    - b :移动至上一个单词的词首

    行内的光标移动:

    数字0: 移动到当前行行首
    ^: 移动到行首的非空白字符
    $: 移动到绝对行尾

    行间光标移动(几个哥哥):

    shift + G: 大写G,光标移动到最后一行的行首
    gg: 两个小写g,光标移动到最前面一行的行首
    数字+gg: 光标移动到数字行的行首,例如12gg,移动到第12行行首

    翻页:

    ctrl + f : 向后翻页
    ctrl + b: 向前翻页

    删除&替换单个字符:

    - x: 删除光标处的字符
    - 3x: 删除光标开始3个字符
    - r: 替换光标处的字符

    删除行、单词:

    - d: 删除命令
    - dd: 删除一行
    - 2dd: 删除两行
    - dw: 删除一个单词
    - 2dw: 删除两个单词

    复制&粘贴&剪切:

    - y : 复制命令
    - yy : 复制一行
    - 2yy : 复制两行
    - yw : 复制一个单词
    - 2yw : 复制两个单词
    
    - p : 粘贴在下方
    - P : 粘贴在上方

    如果是删除配合粘贴,则就是windows中的剪切。在执行dd的时候,删除的内容会放入缓存区,此时可以用p来粘贴。

    撤销&重做:

    - u : 撤销上次的操作
    ctrl+r : 撤销上次的撤销
    - . : 重复上次的操作

    查找内容:

    两种方式:

    末行模式:
    :/word
    编辑模式:
    /word
    - n : 下一个目标
    - N : 上一个目标

    5.末行模式下的基本操作

    显示行号:

    :set nu

    取消显示行号:

    :set nonu

    末行模式查找单词word,光标会定位到第一个word所在行的行首:

    :/word

    另一种方式则是在编辑模式下,直接使用"/word"来查找,这种方式光标会停在第一个word单词的w上。

    范围操作:

    删除指定范围的行(1,$-1):

    :1,$-1d

    意思是从第1行删除到倒数第2行,$表示最后一行,$-1则是倒数第二行,d表示删除命令。

    删除全部行:

    :1,$d

    1,$表示全文,也可以使用%代替1,$

    :%d

    用"."代表当前行:

    :1,.y  #意思是复制从第一行到当前行。
    :.,.+3d  #从当前行开始删除,一共删除4行

    替换内容:

    :1,$s/word1/word2/

    从第一行到最后一行(即全部行),使用s命令将word1全部替换为word2。之间的"/"是分隔符,如果word1和word2中出现了"/",则不能再使用"/"作为分隔符,我们可以使用其他特殊字符,例如"#"。

    :1,$s#word1#word/2#

    注意:以上命令在替换时,如果一行中有2个word1时,只会替换第一个word1。如果想要全部替换,则在最后加上g,表示global。

    :1,$s#word1#word/2#g

    四、正则

    通配符:

    ls -l | grep a*
    ls -l | grep a??

    "*"和"?"都为通配符,"*"代表0-n个任意字符,"?"表示1个任意字符。

    正则里的匹配操作符:

     : 转义字符
    . : 匹配任意单个字符,类似通配符中的?
    [125ak] : 匹配方括号中任意一个字符
    [^12] : 匹配不是1、2的任意一个字符
    [a-k] : 匹配属于a-k范围任意一个字符
    ^ : 行首
    $ : 行尾
    < : 单词开头,例如<abc,以abc开头的单词
    > : 单词结尾,xyz>,以xyz结尾的单词

    正则中的重复操作符:

    ? : 匹配0到1次
    * : 匹配0到n次 
    + : 匹配1到多次
    {n} : 匹配n次
    {n,} : 匹配n到多次
    {n,m} : 匹配n到m次

    选择:

    grep "(oo)(xx).*21" filename

    将oo和xx分组,".*"表示匹配任意个任意字符,然后最后oo、xx换位置,匹配到"ooxx128376xxoo"。

    五、切割

    cut命令:

    # 以空格分隔,显示第一列
    cut -d' ' -f1 content.txt
    # 以空格分隔,显示第二列,发现没有第二列的行又出现了。
    cut -d' ' -f2 content.txt
    # -s 处理脏数据,即不含分隔符的行,只作为第一列。
    cut -s -d' ' -f2 content.txt
    # 显示第1和第3列
    cut -s -d' ' -f1,3 content.txt
    # 显示1-3列
    cut -s -d' ' -f1-3 content.txt

    六、排序

    sort命令:

    # 以空格为分隔符,按第2列排序,字典序
    sort -t' ' -k2 sort.txt
    # -n表示数字序
    sort -t' ' -k2 -n sort.txt
    # -r表示倒序
    sort -t' ' -k2 -n -r sort.txt

    七、统计

    wc命令(word count):

    # 统计行数
    wc -l sort.txt
    # 统计byte数
    wc -c sort.txt
    # 统计char数
    wc -m sort.txt
    # 统计单词数
    wc -w sort.txt
    # 统计最长行的长度
    wc -L sort.txt

    组合使用:

    # 统计一个/etc文件夹有多少文件和目录
    ls -l /etc | wc -l
    # 只获取文件的行数(只获取数字)
    cat sort.txt | wc -l

    八、行编辑器 [sed]

    # 在第一行后面添加hello world。注意,这里hello前面是反斜杠。
    sed "1ahello world" sort.txt

     在以上命令中,添加后的内容实际是没有真正写到文件中的,如果要写到文件中去,则需要使用 -i 。

    # 在第一行后面添加hello world,并真正写入文档。
    sed -i "1ahello world" sort.txt
    # 删除第2行
    sed "2d" sort.txt
    # 删除所有有hello的行,注意这里的过滤条件两边是正斜杠。
    sed "/hello/d" sort.txt
    # 删除含数字的行
    sed "/[0-9]/d" sort.txt
    # 只打印带数字的行
    sed -n "/[0-9]/p" sort.txt
    #其中-n表示静默模式,即不再默认显示模式空间中的内容,如果不含-n,则会显示文本全部内容
    # p表示print打印
    # 相当于代替了grep "[0-9]" sort.txt
    # 在最后一行后面插入内容。$表示最后一行,注意这里只能使用单引号。否则$后面的内容会被认为是命令
    sed -i '$ahello world' sort.txt

    将inittab中的"id:3:initdefault:"替换为"id:5:initdefault:" (即将开机命令行模式修改为开机图形界面):

    sed -i "s/id:[0-6]:initdefault:/id:5:initdefault:/" inittab

    也可以加上分组来实现 (id:为第一组,:initdefault:为第二组):

    sed -i "s/(id:)[0-6](:initdefault:)/152/" inittab

    九、文本分析工具 [awk]

    awk也是按行来处理的,会将操作分别作用于每一行。

    # -F设置分隔符,print表示打印,$1表示第一列。注意{}外面只能用单引号。
    awk -F':' '{print $1}' passwd
    # 打印第一列和第七列,用逗号隔开
    awk -F':' '{print $1,$7}' passwd

    在第一行前面和最后面打印标签:

    awk -F':' 'BEGIN{print "name	number"} {print $1"	"$7} END{print "this is end"}'

    BEGIN、END是有名函数表示在第一行之前以及最后一行之后执行一次。print打印的字符串要用双引号, 是制表符。

    打印passwd文件中的行数,每行的列数,行的内容:

    # 打印行数,每行列数,行的所有内容
    [root@centos-clone1 etc]# awk -F':' '{print NR"	"NF"	"$0}' passwd
    1       7       root:x:0:0:root:/root:/bin/bash
    2       7       bin:x:1:1:bin:/bin:/sbin/nologin
    3       7       daemon:x:2:2:daemon:/sbin:/sbin/nologin
    4       7       adm:x:3:4:adm:/var/adm:/sbin/nologin
    5       7       lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
    6       7       sync:x:5:0:sync:/sbin:/bin/sync

    其中NR(number row)表示行号,NF(number field)表示列数,$0表示该行的多有内容。

    综合示例:

    Tom     0       2012-12-11      car     3000
    John    1       2013-01-13      bike    1000
    vivi    1       2013-01-18      car     2800
    Tom     0       2013-01-20      car     2500
    John    1       2013-01-28      bike    3500

    使用awk统计1月份每个人发的工资,其中Tom的工资分为12月和1月,我们只需要1月的。John有2份1月的工资,需要加起来。

    awk '{split($3,date,"-");if(date[2]=='01'){name[$1]+=$5}} END{for(i in name){print i"	"name[i]}}' test.txt

    解释:

    1.awk 默认分隔符为空格或制表符等空白符,所以这里不用指定-F。

    2.使用split将$3 (2013-01-13)也就是日期分隔,使用"-"作为分隔符,将分隔后的数组放入date。

    3.date[0]表示分隔前的整个时间 (2013-01-13),date[2]表示月份 (01),当date[2]为01月时,定义一个name hashmap,key为$1即文本的第一列人名,并对工资进行累加。

    4.所有累加做完以后,在END中循环name hashmap,打印其中的名字和工资。

    示例2:

    上述文本中第2列的0表示Manager,1表示worker。我们需要在最后的报表结果中的内一行中将人的角色也打印出来。

    awk '{split($3,date,"-");if(date[2]=='01'){name[$1]+=$5};if($2=="0"){role[$1]="Manager"}else{role[$1]="Worker"}} END{for(i in name){print i"	"role[i]"	"name[i]}}' test.txt

    1.同name数据结构一样,我们再添加一个叫role的hashmap,用来保存每个人的角色。

    2.在最后打印的时候,通过key名称来访问他的角色,并一起打印。

  • 相关阅读:
    Java并发编程基本概念
    详解TCP:顺序和丢包问题
    详解TCP:三次握手、四次挥手
    使用DockerFile构建运行GoWeb
    Go之Gorm和BeegoORM简介及配置使用
    Nginx WebUI管理
    Kibana配置nginx反代并本地ca加密nginx
    07 . ELK Stack7.2一键多机部署脚本
    腾讯蓝鲸自动化运维平台简介部署及常见报错解决
    Go操作Redis
  • 原文地址:https://www.cnblogs.com/leokale-zz/p/11677247.html
Copyright © 2020-2023  润新知