zoukankan      html  css  js  c++  java
  • [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名称来访问他的角色,并一起打印。

  • 相关阅读:
    Linux 下的类似Windows下Everything的搜索工具
    windows和linux环境下制作U盘启动盘
    程序调试手段之gdb, vxworks shell
    LeetCode 1021. Remove Outermost Parentheses (删除最外层的括号)
    LeetCode 1047. Remove All Adjacent Duplicates In String (删除字符串中的所有相邻重复项)
    LeetCode 844. Backspace String Compare (比较含退格的字符串)
    LeetCode 860. Lemonade Change (柠檬水找零)
    LeetCode 1221. Split a String in Balanced Strings (分割平衡字符串)
    LeetCode 1046. Last Stone Weight (最后一块石头的重量 )
    LeetCode 746. Min Cost Climbing Stairs (使用最小花费爬楼梯)
  • 原文地址:https://www.cnblogs.com/leokale-zz/p/11677247.html
Copyright © 2011-2022 走看看