Linux 菜鸟私房菜知识架构

第五章、Linux 的文件权限与目录配置

用户管理

[root@study ~]# groupadd project        <==增加新的群组 [root@study ~]# useradd -g project alex <="=建立" 账号,且支持 arod id 账号的属性 uid="1001(alex)" gid="1002(alex)" groups="1002(alex),1001(project)" 

man page

按键 header 2
空格 下翻一页
home 去到第一页
End 去到最后一页
/?string 向下/上搜索

文件权限与配置

chgrp :改变文件所属群组 
chown :改变文件拥有者 
chmod :改变文件的权限, SUID, SGID, SBIT 等等的特性 
 #将file_new的拥有者与群组改回为 chown user:group file
 chown root:root file_new 

chmod

        u 
        g      +(加入)  r:4
chmod   o      -(除去)  w:2    file
        a      =(设定)  x:1

 chmod  u=rwx,go=rx  .bashrc 
 #拿掉全部人的可执行权限
  chmod  a-x  .bashrc 

文件与目录管理

cp,mv

  • cp (复制文件或目录)
[root@study ~]# cp [options] source1 source2 source3 .... directory 
选项与参数: 
-a  :相当于 -dr --preserve=all 的意思,至于 dr 请参考下列说明;(常用) 
-d  :若来源文件为链接文件的属性(link file),则复制链接文件属性而非文件本身; 
-f  :为强制(force)的意思,若目标文件已经存在且无法开启,则移除后再尝试一次; 
-i  :若目标文件(destination)已经存在时,在覆盖时会先询问动作的进行(常用) 
-l  :进行硬式连结(hard link)的连结档建立,而非复制文件本身; 
-p  :连同文件的属性(权限、用户、时间)一起复制过去,而非使用默认属性(备份常用); 
-r  :递归持续复制,用于目录的复制行为;(常用) 
-s  :复制成为符号链接文件 (symbolic link),亦即『快捷方式』文件; 
-u  :destination 比 source 旧才更新 destination,或 destination 不存在的情况下才复制。 
--preserve=all :除了 -p 的权限相关参数外,还加入 SELinux 的属性, links, xattr 等也复制了。 
最后需要注意的,如果来源档有两个以上,则最后一个目的文件一定要是『目录』才行! 
  • mv

    [root@study ~]# mv [-fiu] source destination 
    选项与参数: 
    -f  :force 强制的意思,如果目标文件已经存在,不会询问而直接覆盖; 
    -i  :若目标文件 (destination) 已经存在时,就会询问是否覆盖! 
    -u  :若目标文件已经存在,且 source 比较新,才会更新 (update) 

文件名与目录名称

[root@study ~]# basename /etc/sysconfig/network 
network         <== 很简单!就取得最后的档名~ [root@study ~]# dirname etc sysconfig network <="=" 取得的变成目录名了! 

文件内容查阅

  • cat [-AbEnTv] / tac(反向显示)

    选项与参数: 
    -A  :相当于 -vET 的整合选项,可列出一些特殊字符而不是空白而已; 
    -b  :列出行号,仅针对非空白行做行号显示,空白行不标行号! 
    -E  :将结尾的断行字符 $ 显示出来; 
    -n  :打印出行号,连同空白行也会有行号,与 -b 的选项不同; 
    -T  :将 [tab] 按键以 ^I 显示出来; 
    -v  :列出一些看不出来的特殊字符 
  • nl (添加行号打印) z

    [root@study ~]# nl [-bnw] 文件 
    选项与参数: 
    -b  :指定行号指定的方式,主要有两种: 
          -b a :表示不论是否为空行,也同样列出行号(类似 cat -n); 
          -b t :如果有空行,空的那一行不要列出行号(默认值); 
    -n  :列出行号表示的方法,主要有三种: 
          -n ln :行号在屏幕的最左方显示; 
          -n rn :行号在自己字段的最右方显示,且不加 0 ; 
          -n rz :行号在自己字段的最右方显示,且加 0 ; 
    -w  :行号字段的占用的字符数。 

文件预设权限:umask

[root@study ~]# umask 
0022             <==与一般权限有关的是后面三个数字! [root@study ~]# umask -s u="rwx,g=rx,o=rx" 

文件隐藏属性

chattr

[root@study ~]# chattr [+-=][ASacdistu] 文件或目录名称 
选项与参数: 
+   :增加某一个特殊参数,其他原本存在参数则不动。 
-   :移除某一个特殊参数,其他原本存在参数则不动。 
=   :设定一定,且仅有后面接的参数 

A  :当设定了 A 这个属性时,若你有存取此文件(或目录)时,他的访问时间 atime 将不会被修改, 
     可避免 I/O 较慢的机器过度的存取磁盘。(目前建议使用文件系统挂载参数处理这个项目) 
S  :一般文件是异步写入磁盘的(原理请参考前一章 sync 的说明),如果加上 S 这个属性时, 
     当你进行任何文件的修改,该更动会『同步』写入磁盘中。 
a  :当设定 a 之后,这个文件将只能增加数据,而不能删除也不能修改数据,只有 root 才能设定这属性 
c  :这个属性设定之后,将会自动的将此文件『压缩』,在读取的时候将会自动解压缩, 
     但是在储存的时候,将会先进行压缩后再储存(看来对于大文件似乎蛮有用的!) 
d  :当 dump 程序被执行的时候,设定 d 属性将可使该文件(或目录)不会被 dump 备份 
i  :这个 i 可就很厉害了!他可以让一个文件『不能被删除、改名、设定连结也无法写入或新增数据!』 
     对于系统安全性有相当大的帮助!只有 root 能设定此属性 
s  :当文件设定了 s 属性时,如果这个文件被删除,他将会被完全的移除出这个硬盘空间, 
     所以如果误删了,完全无法救回来了喔! 
u  :与 s 相反的,当使用 u 来配置文件案时,如果该文件被删除了,则数据内容其实还存在磁盘中, 
     可以使用来救援该文件喔! 
注意 1:属性设定常见的是 a 与 i 的设定值,而且很多设定值必须要身为 root 才能设定 
注意 2:xfs 文件系统仅支援 AadiS 而已 
范例:请尝试到/tmp 底下建立文件,并加入 i 的参数,尝试删除看看。 

[root@study ~]# cd /tmp 
[root@study tmp]# touch attrtest     <==建立一个空文件 [root@study tmp]# chattr +i attrtest <="=给予" i 的属性 rm rm: remove regular empty file `attrtest'? y cannot `attrtest': operation not permitted # 看到了吗?呼呼!连 root 也没有办法将这个文件删除呢!赶紧解除设定! 范例:请将该文件的 属性取消! -i 

lsattr (显示文件隐藏属性)

[root@study ~]# lsattr [-adR] 文件或目录 
选项与参数: 
-a :将隐藏文件的属性也秀出来; 
-d :如果接的是目录,仅列出目录本身的属性而非目录内的文件名; 
-R :连同子目录的数据也一并列出来!  

[root@study tmp]# chattr +aiS attrtest 
[root@study tmp]# lsattr attrtest 
--S-ia---------- attrtest 

文件特殊权限:

-rwsr-xr-x Set UID

  • 二进制可执行
  • 运行拥有owner权限

SUID 仅可用在 binary program 上, 不能够用在 shell script 上面!

-rwx--s--x. Set GID

  • 二进制可执行
  • 运行拥有Group权限

drwxrwxrwt Sticky Bit 目录有效,文件无效

  • 用户具有w,x
  • 当用户在该目录下建立文件或目录时,仅有自己与 root 才有权力删除该文件
4  为  SUID 
2  为  SGID 
1  为  SBIT 
file 设置 -rwsr-xr-x ==> chmod 4755 filename (4 + 755) 
[root@study tmp]# chmod 6755 test; ls -l test <==加入具有 0 1 16 1755 7666 suid sgid 的权限 -rwsr-sr-x root jun 02:53 test [root@study tmp]# chmod test; ls -l <="=加入" sbit 的功能! -rwxr-xr-t 权限 -rwsrwsrwt 为 u+s ,而 g+s ,sbit 则是 o+t # 设定权限成为 -rws--x--x 的模样: u="rwxs,go=x" 承上,加上 与 在上述的文件权限中! g+s,o+t -rws--s--t 

脚本文件名的搜寻

which (寻找『执行档』)

[root@study ~]# which [-a] command 
选项或参数: 
-a :将所有由 PATH 目录中可以找到的指令均列出,而不止第一个被找到的指令名称 

whereis (由一些特定的目录中寻找文件文件名)

只找系统中某些特定目录底下的文件

[root@study ~]# whereis [-bmsu] 文件或目录名 
选项与参数: 
-l    :可以列出 whereis 会去查询的几个主要目录而已 
-b    :只找 binary 格式的文件 
-m    :只找在说明文件 manual 路径下的文件 
-s    :只找 source 来源文件 
-u    :搜寻不在上述三个项目当中的其他特殊文件 

范例一:请找出 ifconfig 这个档名 
[root@study ~]# whereis ifconfig  
ifconfig: /sbin/ifconfig /usr/share/man/man8/ifconfig.8.gz 

范例二:只找出跟 passwd 有关的『说明文件』档名(man page) 
[root@study ~]# whereis passwd     # 全部的档名通通列出来! 
passwd: /usr/bin/passwd /etc/passwd /usr/share/man/man1/passwd.1.gz 
/usr/share/man/man5/passwd.5.gz 
[root@study ~]# whereis -m passwd  # 只有在 man 里面的档名才抓出来! 
passwd: /usr/share/man/man1/passwd.1.gz /usr/share/man/man5/passwd.5.gz 

locate / updatedb

是利用数据库来搜寻文件名,『已建立的数据库 /var/lib/mlocate/

[root@study ~]# locate [-ir] keyword 
选项与参数: 
-i  :忽略大小写的差异; 
-c  :不输出档名,仅计算找到的文件数量 
-l  :仅输出几行的意思,例如输出五行则是 -l 5 
-S  :输出 locate 所使用的数据库文件的相关信息,包括该数据库纪录的文件/目录数量等 
-r  :后面可接正规表示法的显示方式 

范例一:找出系统中所有与 passwd 相关的档名,且只列出 5 个 
[root@study ~]# locate -l 5 passwd 
/etc/passwd 
/etc/passwd- 
/etc/pam.d/passwd 
/etc/security/opasswd 
/usr/bin/gpasswd 

范例二:列出 locate 查询所使用的数据库文件之文件名与各数据数量 
[root@study ~]# locate -S 
Database /var/lib/mlocate/mlocate.db: 
        8,086 directories     # 总纪录目录数 
        109,605 files         # 总纪录文件数 
        5,190,295 bytes in file names 
        2,349,150 bytes used to store database 

updatedb 更新数据库, updatedb 指令会去读取 /etc/updatedb.conf 这个配置文件的设定

find

  • 时间相关

    [root@study ~]# find [PATH] [option] [action] 
    选项与参数: 
    1. 与时间有关的选项:共有 -atime, -ctime 与 -mtime ,以 -mtime 说明 
       -mtime  n :n 为数字,意义为在 n 天之前的『一天之内』被更动过内容的文件; 
       -mtime +n :列出在 n 天之前(不含 n 天本身)被更动过内容的文件档名; 
       -mtime -n :列出在 n 天之内(含 n 天本身)被更动过内容的文件档名。 
       -newer file :file 为一个存在的文件,列出比 file 还要新的文件档名 
    
    范例一:将过去系统上面 24 小时内有更动过内容 (mtime) 的文件列出 
    [root@study ~]# find / -mtime 0 
    # 那个 0 是重点!0 代表目前的时间,所以,从现在开始到 24 小时前, 
    # 有变动过内容的文件都会被列出来!那如果是三天前的 24 小时内? 
    # find / -mtime 3 有变动过的文件都被列出的意思! 
    
    范例二:寻找 /etc 底下的文件,如果文件日期比 /etc/passwd 新就列出 
    [root@study ~]# find /etc -newer /etc/passwd 
    # -newer 用在分辨两个文件之间的新旧关系是很有用的! 
    
    范例三:
      4 则是代表 4-5 那一天的文件档名:ex> find /var -mtime 4 
      -4 代表小于等于 4 天内的文件档名:ex> find /var -mtime -4 
      +4 代表大于等于 5 天前的檔名:ex> find /var -mtime +4
  • 用户相关

    选项与参数: 
    2. 与使用者或组名有关的参数: 
       -uid n :n 为数字,这个数字是用户的账号 ID,亦即 UID ,这个 UID 是记录在 
                /etc/passwd 里面与账号名称对应的数字。这方面我们会在第四篇介绍。 
       -gid n :n 为数字,这个数字是组名的 ID,亦即 GID,这个 GID 记录在 
                /etc/group,相关的介绍我们会第四篇说明~ 
       -user name :name 为使用者账号名称喔!例如 dmtsai  
       -group name:name 为组名喔,例如 users ; 
       -nouser    :寻找文件的拥有者不存在 /etc/passwd 的人! 
       -nogroup   :寻找文件的拥有群组不存在于 /etc/group 的文件! 
                    当你自行安装软件时,很可能该软件的属性当中并没有文件拥有者, 
                    这是可能的!在这个时候,就可以使用 -nouser 与 -nogroup 搜寻。 
    
    范例三:搜寻 /home 底下属于 dmtsai 的文件 
    [root@study ~]# find /home -user dmtsai 
    # 这个东西也很有用的~当我们要找出任何一个用户在系统当中的所有文件时, 
    # 就可以利用这个指令将属于某个使用者的所有文件都找出来喔! 
    
    范例四:搜寻系统中不属于任何人的文件 
    [root@study ~]# find / -nouser 
    # 透过这个指令,可以轻易的就找出那些不太正常的文件。如果有找到不属于系统任何人的文件时, 
    # 不要太紧张,那有时候是正常的~尤其是你曾经以原始码自行编译软件时。 
  • 文件类型

    3. 与文件权限及名称有关的参数: 
       -name filename:搜寻文件名为 filename 的文件; 
       -size [+-]SIZE:搜寻比 SIZE 还要大(+)或小(-)的文件。这个 SIZE 的规格有: 
                       c: 代表 byte, k: 代表 1024bytes。所以,要找比 50KB 
                       还要大的文件,就是『 -size +50k 』 
       -type TYPE    :搜寻文件的类型为 TYPE 的,类型主要有:一般正规文件 (f), 装置文件 (b, c), 
                       目录 (d), 连结档 (l), socket (s), 及 FIFO (p) 等属性。 
       -perm mode  :搜寻文件权限『刚好等于』 mode 的文件,这个 mode 为类似 chmod 
                     的属性值,举例来说, -rwsr-xr-x 的属性为 4755 ! 
       -perm -mode :搜寻文件权限『必须要全部囊括 mode 的权限』的文件,举例来说,                  我们要搜寻 -rwxr--r-- ,亦即 0744 的文件,使用 -perm -0744, 
                     当一个文件的权限为 -rwsr-xr-x ,亦即 4755 时,也会被列出来, 
                     因为 -rwsr-xr-x 的属性已经囊括了 -rwxr--r-- 的属性了。 
       -perm /mode :搜寻文件权限『包含任一 mode 的权限』的文件,举例来说,我们搜寻 
                     -rwxr-xr-x ,亦即 -perm /755 时,但一个文件属性为 -rw------- 
                     也会被列出来,因为他有 -rw.... 的属性存在! 
    
    范例五:找出档名为 passwd 这个文件 
    [root@study ~]# find / -name passwd 
    
    范例五-1:找出文件名包含了 passwd 这个关键词的文件 
    [root@study ~]# find / -name "*passwd*" 
    # 利用这个 -name 可以搜寻档名啊!默认是完整文件名,如果想要找关键词, 
    # 可以使用类似 * 的任意字符来处理 
    
    范例六:找出 /run 目录下,文件类型为 Socket 的檔名有哪些? 
    [root@study ~]# find /run -type s 
    # 这个 -type 的属性也很有帮助喔!尤其是要找出那些怪异的文件, 
    # 例如 socket 与 FIFO 文件,可以用 find /run -type p 或 -type s 来找! 
    
    范例七:搜寻文件当中含有 SGID 或 SUID 或 SBIT 的属性 
    [root@study ~]# find / -perm /7000  
    # 所谓的 7000 就是 ---s--s--t ,那么只要含有 s 或 t 的就列出,所以当然要使用 /7000, 
    # 使用 -7000 表示要同时含有 ---s--s--t 的所有三个权限。而只需要任意一个,就是 /7000 ~瞭乎? 
  • 额~外可进行的动作:

    4. 额外可进行的动作: 
       -exec command :command 为其他指令,-exec 后面可再接额外的指令来处理搜寻到的结果。 
       -print        :将结果打印到屏幕上,这个动作是预设动作! 
    
    范例八:将上个范例找到的文件使用 ls -l 列出来~ 
    [root@study ~]# find /usr/bin /usr/sbin -perm /7000 -exec ls -l {} \; 
    # 注意到,那个 -exec 后面的 ls -l 就是额外的指令,指令不支持命令别名, 
    # 所以仅能使用 ls -l 不可以使用 ll 喔!注意注意! 
    
    范例九:找出系统中,大于 1MB 的文件 
    [root@study ~]# find / -size +1M 

第七章、Linux磁盘与文件系统

EXT2 inode

  • dumpe2fs: 查询 Ext 家族 superblock 信息的指令

    [root@study ~]# dumpe2fs [-bh] 装置文件名 
    选项与参数: 
    -b :列出保留为坏轨的部分(一般用不到吧!?) 
    -h :仅列出 superblock 的数据,不会列出其他的区段内容! 
    
    范例:鸟哥的一块 1GB ext4 文件系统内容 
    [root@study ~]# blkid   <==这个指令可以叫出目前系统有被格式化的装置 dev vda3: uuid="12y99K-bv2A-y7RY-jhEW-rIWf-PcH5-SaiApN" type="LVM2_member" vda5: <="=看到" ext4 了! [root@study ~]# dumpe2fs vda5 1.42.9 (28-dec-2013) filesystem volume name:            # 文件系统的名称(不一定会有) 
    Last mounted on:            # 上一次挂载的目录位置 
    Filesystem UUID:          e20d65d9-20d4-472f-9f91-cdcfb30219d6 
    Filesystem magic number:  0xEF53           # 上方的 UUID 为 Linux 对装置的定义码 
    Filesystem revision #:    1 (dynamic)      # 下方的 features 为文件系统的特征数据 
    Filesystem features:      has_journal ext_attr resize_inode dir_index filetype extent 64bit  
     flex_bg sparse_super large_file huge_file uninit_bg dir_nlink extra_isize 
    Filesystem flags:         signed_directory_hash 
    Default mount options:    user_xattr acl   # 预设在挂载时会主动加上的挂载参数 
    Filesystem state:         clean            # 这块文件系统的状态为何,clean 是没问题 
    Errors behavior:          Continue 
    Filesystem OS type:       Linux 
    Inode count:              65536            # inode 的总数 
    Block count:              262144           # block 的总数 
    Reserved block count:     13107            # 保留的 block 总数 
    Free blocks:              249189           # 还有多少的 block 可用数量 
    Free inodes:              65525            # 还有多少的 inode 可用数量 
    First block:              0 
    Block size:               4096             # 单个 block 的容量大小 
    Fragment size:            4096 
    Group descriptor size:    64 
    ....(中间省略).... 
    Inode size:               256              # inode 的容量大小!已经是 256 了喔! 
    ....(中间省略).... 
    Journal inode:            8 
    Default directory hash:   half_md4 
    Directory Hash Seed:      3c2568b4-1a7e-44cf-95a2-c8867fb19fbc 
    Journal backup:           inode blocks 
    Journal features:         (none) 
    Journal size:             32M              # Journal 日志式数据的可供纪录总容量 
    Journal length:           8192 
    Journal sequence:         0x00000001 
    Journal start:            0 
    
    Group 0: (Blocks 0-32767)                  # 第一块 block group 位置 
      Checksum 0x13be, unused inodes 8181 
      Primary superblock at 0, Group descriptors at 1-1   # 主要 superblock 的所在喔! 
    
     Reserved GDT blocks at 2-128 
      Block bitmap at 129 (+129), Inode bitmap at 145 (+145) 
      Inode table at 161-672 (+161)                       # inode table 的所在喔! 
      28521 free blocks, 8181 free inodes, 2 directories, 8181 unused inodes 
      Free blocks: 142-144, 153-160, 4258-32767           # 底下两行说明剩余的容量有多少 
      Free inodes: 12-8192 
    Group 1: (Blocks 32768-65535) [INODE_UNINIT]          # 后续为更多其他的 block group 喔! 
    ....(底下省略).... 
    # 由于数据量非常的庞大,因此鸟哥将一些信息省略输出了!上表与你的屏幕会有点差异。 
    # 前半部在秀出 supberblock 的内容,包括标头名称(Label)以及 inode/block 的相关信息 
    # 后面则是每个 block group 的个别信息了!您可以看到各区段数据所在的号码! 
    # 也就是说,基本上所有的数据还是与 block 的号码有关就是了!很重要! 

文件系统的简单操作

  • df:列出文件系统的整体磁盘使用量

    [root@study ~]# df [-ahikHTm] [目录或文件名] 
    选项与参数: 
    -a  :列出所有的文件系统,包括系统特有的 /proc 等文件系统; 
    -k  :以 KBytes 的容量显示各文件系统; 
    -m  :以 MBytes 的容量显示各文件系统; 
    -h  :以人们较易阅读的 GBytes, MBytes, KBytes 等格式自行显示; 
    -H  :以 M=1000K 取代 M=1024K 的进位方式; 
    -T  :连同该 partition 的 filesystem 名称 (例如 xfs) 也列出; 
    -i  :不用磁盘容量,而以 inode 的数量来显示 

    案例:

    范例一:将系统内所有的 filesystem 列出来!
    [root@study ~]# df 
    Filesystem              1K-blocks    Used Available Use% Mounted on 
    /dev/mapper/centos-root  10475520 3409408   7066112  33% / 
    devtmpfs                   627700       0    627700   0% /dev 
    tmpfs                      637568      80    637488   1% /dev/shm 
    范例二:将系统内的所有特殊文件格式及名称都列出来 
    [root@study ~]# df -aT 
    Filesystem              Type        1K-blocks    Used Available Use% Mounted on 
    rootfs                  rootfs       10475520 3409368   7066152  33% / 
    proc                    proc                0       0         0    - /proc 
    sysfs                   sysfs               0       0         0    - /sys 
    devtmpfs                devtmpfs       627700       0    627700   0% /dev 
  • du:评估文件系统的磁盘使用量

    [root@study ~]# du [-ahskm] 文件或目录名称 
    选项与参数: 
    -a  :列出所有的文件与目录容量,因为默认仅统计目录底下的文件量而已。 
    -h  :以人们较易读的容量格式 (G/M) 显示; 
    -s  :列出总量而已,而不列出每个各别的目录占用容量; 
    -S  :不包括子目录下的总计,与 -s 有点差别。 
    -k  :以 KBytes 列出容量显示; 
    -m  :以 MBytes 列出容量显示; 

    案例:

    范例一:列出目前目录下的所有文件容量 
    [root@study ~]# du 
    4       ./.cache/dconf  <==每个目录都会列出来 0 4 8 . .cache abrt ....(中间省略).... test4 .ssh <="=包括隐藏文件的目录" 

磁盘的分区、格式化、检验

使用逻辑: 你应该要透过 lsblk 或 blkid 先找到磁盘,再用 parted /dev/xxx print 来找出内部的分区表类型,之
后才用 gdisk 或 fdisk 来操作系统

  • lsblk 列出系统上的所有磁盘列表

    [root@study ~]# lsblk [-dfimpt] [device] 
    选项与参数: 
    -d  :仅列出磁盘本身,并不会列出该磁盘的分区数据 
    -f  :同时列出该磁盘内的文件系统名称 
    -i  :使用 ASCII 的线段输出,不要使用复杂的编码 (再某些环境下很有用) 
    -m  :同时输出该装置在 /dev 底下的权限数据 (rwx 的数据) 
    -p  :列出该装置的完整文件名!而不是仅列出最后的名字而已。 
    -t  :列出该磁盘装置的详细数据,包括磁盘队列机制、预读写的数据量大小等 
  • blkid 列出装置的 UUID 等参数

  • parted 列出磁盘的分区表类型与分区信息

    范例一:列出 /dev/vda 磁盘的相关数据 
    [root@study ~]# parted /dev/vda print 
    Model: Virtio Block Device (virtblk)        # 磁盘的模块名称(厂商) 
    Disk /dev/vda: 42.9GB                       # 磁盘的总容量 
    Sector size (logical/physical): 512B/512B   # 磁盘的每个逻辑/物理扇区容量 
    Partition Table: gpt                        # 分区表的格式 (MBR/GPT) 
    Disk Flags: pmbr_boot 
    
    Number  Start   End     Size    File system  Name  Flags      # 底下才是分区数据 
     1      1049kB  3146kB  2097kB                     bios_grub 
     2      3146kB  1077MB  1074MB  xfs 
     3      1077MB  33.3GB  32.2GB                     lvm 

gdisk

实践最简单Demo

范例:由前一小节的 lsblk 输出,我们知道系统有个 /dev/vda,请观察该磁盘的分区与相关数据 
[root@study ~]# gdisk /dev/vda  <==仔细看,不要加上数字喔! 1 2 3 128 512 2048 6143 6144 2103295 2103296 18862013 65026047 83886046 83886080 gpt fdisk (gdisk) version 0.8.6 partition table scan: mbr: protective bsd: not present apm: gpt: found valid with mbr; using gpt. <="=找到了" 的分区表! command (? for help): (?) 来查看可用指令 ? b back up data to a file c change partition's name d delete # 删除一个分区 i show detailed information on l list known types n add new 增加一个分区 o create empty guid (gpt) p print the 印出分区表 (常用) q quit without saving changes 不储存分区就直接离开 gdisk r recovery and transformation options (experts only) s sort partitions t type code v verify disk w write exit 储存分区操作后离开 x extra functionality this menu 这里可以输出目前磁盘的状态 dev vda: sectors, 40.0 gib 磁盘文件名 扇区数与总容量 logical sector size: bytes 单一扇区大小为 identifier (guid): a4c3c813-62af-4bfe-bac9-112ebd87a483 磁盘的 标识符 holds entries first usable is 34, last will be aligned 2048-sector boundaries total free space sectors (9.0 gib) number start (sector) end size 底下为完整的分区信息了! 2.0 mib ef02 第一个分区槽数据 1024.0 0700 30.0 8e00 分区编号 开始扇区号码 结束扇区号码 容量大小 想要不储存离开吗?按下 就对了!不要随便按 啊! 

第十二章、 学习Shell Scripts

12.1 常用命令解析

sudo lsb_release -a // look ubuntu version
uname -r  //kernal version

netstat –tln //查看服务监听端口
netstat      //查看进程号
ps –aux     //查看进程号
ps –aux | more //全部查看
ps –ef | grep mysql //查看mysql的进程
kill -9 3306 //强制杀掉进程号3306

# 查看80端口占用
netstat -luntp | grep 80
# 查看对应程序是否启动
netstat -luntp | grep mysql

diff -ruNa dir1  dir2 > s12.diff

#几种快速清空文件内容的方法
echo "" > fileName
echo /dev/null > fileName
echo > fileName
cat /dev/null > fileName

ln

ln -fs Target_file/Target_dir #在当前目录下新建一个同名链接
ln -fs Target_file/Target_dir  link_rename #指定链接名

tar 加压解压

# bz2
压包:tar  -jcf  target.tar.bz2   target
解压:tar  -jxf  target.tar.bz2
# gz
压包:tar  -zcf  target.tar.gz   target
解压:tar  -zxf  target.tar.gz
# 解压或压包到指定目录: -C
tar  -zxf  target.tar.gz –C /home/dream123/Desktop/(目录)

命令详解

-x 解压
-t 查看内容

grep

*awk *

sed
【Shell】sed使用心得
%s/.*/# &/g 在整个文件的首行插入#
2,10s/Type/type/g #第2至第10行替换Type为type

date

date +%F #2017-01-29
date "+%Y-%m-%d %H:%M:%S" #2017-01-29 10:57:02

应用场景

tar zcvf etc-$(date +%F).tar.gz /etc

进行简单运算

date +%F -d "-1day" #减一天
date +%F -d "+1day" #加一天
date +%F -d "+2hour"#加2hour
date -d -1month +%Y%m%d #减1个月

别名

#列出别名信息
alias
#设置
alias rgrep='ps -ef| grep redis'
//删除
unalias rgrep

性能监控

  • uptime

    [root@www ~]# uptime 
     15:47:19 up 69 days, 20:24,  1 user,  load average: 0.06, 0.08, 0.11
    • 15:47:19 系统时间
    • 69 days, 20:24 运行时间
    • 1 user 一个终端连接(终端Terminal连接数)
    • 0.06, 0.08, 0.11 在过去1,5,15分钟内的系统平均负载(运行队列中的平均进程数)
  • top

    top - 17:19:17 up 69 days, 21:55,  3 users,  load average: 0.02, 0.12, 0.13
    Tasks: 259 total,   2 running, 257 sleeping,   0 stopped,   0 zombie
    %Cpu(s):  10.0/4.6    15[|||||||                                              ]
    KiB Mem :  5971944 total,  2069108 free,  1897640 used,  2005196 buff/cache
    KiB Swap:  3998716 total,  3998716 free,        0 used.  3270516 avail Mem 
    
      PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND     
     2383 joel      20   0 2311856 286256 168372 S  18.6  4.8  10:48.61 chromium-b+ 
     1916 joel      20   0 1520768 130752  73584 R  11.0  2.2   3:32.51 compiz      
      908 root      20   0  359740  46208  33532 S  10.3  0.8   3:37.90 Xorg        
     2542 joel      20   0 1346212 323796  99516 S  10.0  5.4   4:51.57 chromium-b+ 
     2039 joel       9 -11  507632  11780   8812 S   3.7  0.2   0:45.57 pulseaudio  
     2796 joel      20   0 1215292 157504  87592 S   3.7  2.6   0:53.10 chromium-b+
    1. top第一行命令, 如上uptime

    2. top第二行命令介绍(进程信息)

      Tasks: 259 total(进程总数) 2 running(正在运行的进程数) 257 sleeping(睡眠的进程数) 0 stopped(停止的进程数) 0 zombie(僵尸进程数)
    3. 第三行命令介绍(CPU信息)

      %Cpu(s): 9.6 us-->用户空间占用CPU百分比 4.5 sy-->内核空间占用CPU百分比 0.0 ni-->用户进程空间内改变过优先级的进程占用CPU百分比 85.7 id-->空闲CPU百分比 0.3 wa-->等待输入输出的CPU时间百分比 0.0 hi--> 0.0 si--> 0.0 st-->
    4. 第四、五行命令介绍(内存信息)

      KiB Mem : 5971944 total-->物理内存总量 2114336 free-->空闲内存总量 1833032 used-->使用的物理内存总量 2024576 buff/cache-->用作内核缓存的内存量 
      KiB Swap: 3998716 total-->交换区总量, 3998716 free-->空闲交换区总量, 0 used-->使用的交换区总量. 3327816 avail Mem-->
    5. 进程信息

      PID-->进程ID 
      USER-->用户 
      PR-->优先级 
      NI-->nice值。负值表示高优先级,正值表示低优先级 
      VIRT-->进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES 
      RES-->进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA 
      SHR-->共享内存大小,单位kb 
      S-->进程状态。 D=不可中断的睡眠状态R=运行 S=睡眠T=跟踪/停止Z=僵尸进程 
      %CPU-->上次更新到现在的CPU时间占用百分比 
      %MEM-->进程使用的物理内存百分比 
      TIME+-->进程使用的CPU时间总计,单位1/100秒 
      COMMAND-->命令名/命令行
  • vmstat - Report virtual memory statistics
    vmstat结果

    vmstat 1 4 每一秒采集一次,共采集四次

12.2 常用应用场景解析

12.2.1 变量相关

1、变量获取,截取,替换,(没设置、空值、非空值)

2、Shell特殊变量:Shell $0, $#, $*, $@, $?, $和命令行参数 bash shell命令行选项与修传入参数处理

变量 含义
$n $1 the first parameter,$2 the second…
$# The number of command-line parameters.
$0 The name of current program.
$? Last command or function’s return value.
$$ The program’s PID.
$! Last program’s PID.
$@ Save all the parameters.

3、shell 脚本中批量导入指定配置 envsubst

比如手上有个配置文件redis.conf,需要动态修改其参数,如下:

THREAD_NUM:${thread_num}
GPU_ID:${gpu_id}
bind ${ip} ${port}

解决方案一:envsubst

a) 安装

yum install gettext -y

b) 使用

export thread_num=24
export gpu_id=2
export ip=192.168.1.168
export port=6379
envsubst  redis_6379.conf

注意:如果有n个export想死的心都有哈哈,解决方案,统一丢到一个文件里面,如config.conf

export thread_num=24
export gpu_id=2
export ip=192.168.1.168
export port=6379

使其批量生效 source config.conf,一句命令应用就好了

envsubst  redis_6379.conf

12.3 条件判断

12.3.1 if 条件

[ -a FILE ]  如果 FILE 存在则为真。  
[ -b FILE ]  如果 FILE 存在且是一个块特殊文件则为真。  
[ -c FILE ]  如果 FILE 存在且是一个字特殊文件则为真。  
[ -d FILE ]  如果 FILE 存在且是一个目录则为真。  
[ -e FILE ]  如果 FILE 存在则为真。  
[ -f FILE ]  如果 FILE 存在且是一个普通文件则为真。  
[ -g FILE ] 如果 FILE 存在且已经设置了SGID则为真。 [ -h FILE ]  如果 FILE 存在且是一个符号连接则为真。  
[ -k FILE ]  如果 FILE 存在且已经设置了粘制位则为真。  
[ -p FILE ]  如果 FILE 存在且是一个名字管道(F如果O)则为真。  
[ -r FILE ]  如果 FILE 存在且是可读的则为真。  
[ -s FILE ]  如果 FILE 存在且大小不为0则为真。  
[ -t FD ]  如果文件描述符 FD 打开且指向一个终端则为真。  
[ -u FILE ]  如果 FILE 存在且设置了SUID (set user ID)则为真。  
[ -w FILE ]  如果 FILE 如果 FILE 存在且是可写的则为真。  
[ -x FILE ]  如果 FILE 存在且是可执行的则为真。  
[ -O FILE ]  如果 FILE 存在且属有效用户ID则为真。  
[ -G FILE ]  如果 FILE 存在且属有效用户组则为真。  
[ -L FILE ]  如果 FILE 存在且是一个符号连接则为真。  
[ -N FILE ]  如果 FILE 存在 and has been mod如果ied since it was last read则为真。  
[ -S FILE ]  如果 FILE 存在且是一个套接字则为真。  
[ FILE1 -nt FILE2 ]  如果 FILE1 has been changed more recently than FILE2, or 如果 FILE1 exists and FILE2 does not则为真。  
[ FILE1 -ot FILE2 ]  如果 FILE1 比 FILE2 要老, 或者 FILE2 存在且 FILE1 不存在则为真。  
[ FILE1 -ef FILE2 ]  如果 FILE1 和 FILE2 指向相同的设备和节点号则为真。  
[ -o OPTIONNAME ]  如果 shell选项 “OPTIONNAME” 开启则为真。  
[ -z STRING ]  “STRING” 的长度为零则为真。  
[ -n STRING ] or [ STRING ]  “STRING” 的长度为非零 non-zero则为真。  
[ STRING1 == STRING2 ]  如果2个字符串相同。 “=” may be used instead of “==” for strict POSIX compliance则为真。  
[ STRING1 != STRING2 ]  如果字符串不相等则为真。 
[ STRING1 < STRING2 ]  如果 “STRING1” sorts before “STRING2” lexicographically in the current locale则为真。  
[ STRING1 > STRING2 ]  如果 “STRING1” sorts after “STRING2” lexicographically in the current locale则为真。  
[ ARG1 OP ARG2 ] “OP” is one of -eq, -ne, -lt, -le, -gt or -ge. These arithmetic binary operators return true if “ARG1” is equal to, not equal to, less than, less than or equal to, greater than, or greater than or equal to “ARG2”, respectively. “ARG1” and “ARG2” are integers.

12.3.2 while

#!/bin/sh

time = 7006
while[[ "$time" gt 7000 ]]
do
    echo "$time"
    time = $(($time -1 ))
done

12.4 三剑客详解及案例

12.4.1 grep

1)支持正则

-E,--extended-regexp 模式是扩展正则表达式(ERE)
-P,--perl-regexp 模式是 Perl 正则表达式
-e,--regexp=PATTERN 使用模式匹配,可指定多个模式匹
-f,--file=FILE 从文件每一行获取匹配模式
-i,--ignore-case 忽略大小写
-w,--word-regexp 模式匹配整个单词
-x,--line-regexp 模式匹配整行
-v,--invert-match 打印不匹配的行

1、正则过滤

a. 去除空格 http.conf 文件空行或开头#号的行

grep -E -v "^$|^#" /etc/httpd/conf/httpd.conf
  • grep -n 'de$' 匹配 de 字符结尾
  • echo "a bc de" |xargs -n1 |grep '^b' -> 匹配 b 字符开头的行

b. 不区分大小写

echo "A a b c" |xargs -n1 |grep -i a
echo "A a b c" |xargs -n1 |grep '[Aa]'

2、参数匹配功能

echo "a bc de" |xargs -n1 |grep -e 'a' -e 'bc
#output 
a
bc

3、对比功能

输出 b 文件中在 a文件相同的行

grep -f a b

不同行

grep -f -v a b

2) 输入输出控制

-m,--max-count=NUM 输出匹配的结果 num 数
-n,--line-number 打印行号
-H,--with-filename 打印每个匹配的文件名
-h,--no-filename 不输出文件名
-q,--quiet 不输出正常信息
-s, --no-messages 不输出错误信息
-r,--recursive 递归目录
-c,--count 只打印每个文件匹配的行数
-o,--only-matching 只打印匹配的内容
--include=FILE_PATTERN   只检索匹配的文件
--exclude=FILE_PATTERN   跳过匹配的文件
--exclude-from=FILE       跳过匹配的文件,来自文件模式
--exclude-dir=PATTERN     跳过匹配的目录

1、过滤功能

#包含*.conf
grep -r '192.167.1.1' /etc --include *.conf
#排除*.bak
grep -r '192.167.1.1' /etc --exclude *.bak
#排除指定文件
grep -r '192.167.1.1' /opt --exclude-from 

2、匹配的前五个结果

seq 1 20 |grep -m 5 -E '[0-9]{2}'

3、统计匹配两位数的有多少行

seq 1 20 |grep -c -E '[0-9]{2}'

3) 内容行控制

-B,--before-context=NUM 打印匹配的前几行
-A,--after-context=NUM 打印匹配的后几行
-C,--context=NUM 打印匹配的前后几行
--color[=WHEN], 匹配的字体颜色

1、我是一个案例

#匹配结果及后 3 行
seq 1 10 |grep 5 -A 3
#匹配结果及前 3 行
seq 1 10 |grep 5 -B 3
#匹配结果及前后 3 行
seq 1 10 |grep 5 -C 3

12.4.2 sed

sed 命令将当前处理的行读入模式空间进行处理,处理完把结果输出,并清空模式空间。然后再将下一行读入模式空间进行处理输出,以此类推,直到最后一行。还有一个空间叫保持空间,又称暂存空间,可以暂时存放一些处理的数据,但不能直接输出,只能放到模式空间输出。

1)命令详解

-n 不打印模式空间
-e 执行脚本、表达式来处理
-f 执行动作从文件读取执行
-i 修改原文件
-r 使用扩展正则表达式

命令描述

s/regexp/replacement/ 替换字符串

p 打印当前模式空间
P 打印模式空间的第一行

d 删除模式空间,开始下一个循环
D 删除模式空间的第一行,开始下一个循环

= 打印当前行号

a \text 当前行追加文本

i \text 当前行上面插入文本

c \text 所选行替换新文本

q 立即退出 sed 脚本

r 追加文本来自文件

: label label 为 b 和 t 命令

b label 分支到脚本中带有标签的位置,如果分支不存在则分支到脚本的末尾

t label 如果 s///是一个成功的替换,才跳转到标签

h H 复制/追加模式空间到保持空间

g G 复制/追加保持空间到模式空间

x 交换模式空间和保持空间内容

l 打印模式空间的行,并显示控制字符$

n N 读取/追加下一行输入到模式空间

w filename 写入当前模式空间到文件
! 取反、否定

1、地址匹配

  • first~step 步长,每 step 行,从第 first 开始
  • addr1, add2 -> 定址 addr1, add2 决定用于对哪些行进行编辑
  • addr1, +N -> 从 addr1 这行到往下 N 行匹配,总共匹配 N+1 行

案例1:打印从第 5 行开始第一个以 northeast 开头的行之间的所有行

sed -n '5,/northeast/p' ceshi.txt

2、s分隔符替换

#在查找替换有 / 或者其他特殊字符时有用
tail /etc/services | sed -r 's#([0-9]+/udp)#test#g'

紧跟在 s 命令后的字符就是查找串和替换串之间的分隔符。分隔符默认默认为正斜杠,但可以改变。无论什么字符(换行符,反斜线除外),只要紧跟在 s 命令

2)打印匹配

#打印匹配 blp5 开头的行
tail /etc/services |sed -n '/^blp5/p'
#打印第行1
tail /etc/services |sed -n '1p'
#打印奇数行
seq 10 |sed -n '1~2p'
#打印最后一行
tail /etc/services |sed -n '$p'
#不打印最后一行
tail /etc/services |sed -n '$!p'
  • 增加匹配范围

    #匹配blp5,com 开头
    tail /etc/services |sed -n '/^blp5/,/^com/p'
    #匹配blp5开头行到最后一行
    tail /etc/services |sed -n '/blp5/,$p'

2、使用环境变量

 a=1
 tail /etc/services |sed -n ''$a',3p'
 tail /etc/services |sed -n "$a,3p"

3、匹配删除

#删除匹配blp5
tail /etc/services |sed '/blp5/d'
#删除第一行
tail /etc/services |sed '1d'
tail /etc/services |sed '1~2d'
tail /etc/services |sed '1,3d'

3)替换

1、简单替换

#替换 blp5 字符串为 test --> 每行替换首个
tail /etc/services |sed 's/blp5/test/'
#+ g全部替换
tail /etc/services |sed 's/blp5/test/g'
#替换开头是 blp5 的字符串并打印
tail /etc/services |sed -n 's/^blp5/test/p'

2、匹配引用 &

tail /etc/services | sed 's/udp/&.hao/g'
#单引号转双引号
echo '10.10.10.1 10.10.10.2 10.10.10.3' |sed -r 's/[^ ]+/"&"/g'

3、过滤

案例1:对 1-4 行的 blp5 进行替换

#对 1-4 行的 blp5 进行替换
tail /etc/services | sed '1,4s/blp5/test/'

案例2:指定匹配条件替换

#指定存在 48129/tcp 的内容,替换blp5为test
tail /etc/services | sed '/48129\/tcp/s/blp5/test/'

案例3:注释匹配行后的多少行

seq 10 |sed '/5/,+3s/^/#/'
#output
1
2
3
4
#5
#6
#7
#8
9
10

案例4:指定替换

 seq 5 |sed -r 's/^3|^4/#&/'
 seq 5 |sed -r '/^3|^4/s/^/#/'
 seq 5 |sed -r 's/^3|^4/#\0/' 
 # 以上三种表达式效果一样,
 1
 2
 #3
 #4
 5

4、连续替换

tail /etc/services |sed 's/blp5/test/;s/3g/4g/'

5、正则分组精确替换

字符如: 3gpp-cbsp 48049/tcp # 3GPP Cell Broadcast Service

tail /etc/services |sed -r 's/(.*) (.*)(#.*)/\1\2test \3/'

注解: 可以对\1, \2, \3 进行删减,添加指定的内容

  • \1 -> 3gpp-cbsp
  • \2 -> 48049/tcp
  • \3 -> # 3GPP Cell Broadcast Service

案例2: 协议和端口互换

tail /etc/services |sed -r 's/(.*)(\<[0-9]+\>)\/(tcp|udp)(.*)/\1\3\/\2\4/'

案例3:位置替换 ->替换 x 字符为大写:

echo "abc cde xyz" |sed -r 's/(.*)x/\1X/'

案例4:位置替换-> 456 与 cde 调换

 echo "abc:cde;123:456" |sed -r 's/([^:]+)(;.*:)([^:]+$)/\3\2\1/'

案例5:去除开头和结尾空格或制表符

 echo " 1 2 3 " |sed 's/^[ \t]*//;s/[ \t]*$//'

4) 多重编辑与添加

案例1:删除1,2行,并替换

tail /etc/services |sed -e '1,2d' -e 's/blp5/test/'
#可以用;隔开
tail /etc/services |sed '1,2d;s/blp5/test/'

案例2:添加新内容(a、i 和 c)

#在 blp5 上一行添加 test
tail /etc/services |sed '/blp5/i \test'
#在 blp5 下一行添加 test
tail /etc/services |sed '/blp5/a \test'
#blp5所在行整行替换
tail /etc/services |sed '/blp5/c \test'
#指定行下一行添加内容
tail /etc/services |sed '2a \test'
# 在指定行前面和后面添加一行
seq 5 |sed '3s/.*/txt\n&/'

案例3:读取文件并追加到匹配行后(r)

tail /etc/services |sed '/blp5/r a.txt'

案例3:将匹配行写到文件(w)

tail /etc/services |sed '/blp5/w b.txt'

5)读取下一行(n 和 N)

  • n 读取下一行到模式空间。

  • N 追加下一行内容到模式空间,并以换行符\n 分隔。

1、 打印匹配的下一行

seq 5 |sed -n '/3/{n;p}'
#output
4

2、打印偶数

seq 6 |sed -n 'n;p'
#output
2
4
6

sed 先读取第一行 1,执行 n 命令,获取下一行 2,此时模式空间是 2,执行 p 命令,打印模式空

间。 现在模式空间是 2,sed 再读取 3,执行 n 命令,获取下一行 4,此时模式空间为 4,执行 p 命

令,以此类推。

习题:打印奇数

seq 6 |sed 'n;d'
#output
1
3
5

sed 先读取第一行 1,此时模式空间是 1,并打印模式空间 1,执行 n 命令,获取下一行 2,执行 d

命令,删除模式空间的 2,sed 再读取 3,此时模式空间是 3,并打印模式空间,再执行 n 命令,获

取下一行 4,执行 d 命令,删除模式空间的 3,以此类推。

3、每三行执行一次 p 命令

seq 6 | sed 'n;n;p'
1
2
3
3
4
5
6
6

注意:

  • sed 先读取1行
  • n 读取下一行

sed 先读取第一行 1,并打印模式空间 1,执行 n 命令,获取下一行 2,并打印模式空间 2,再执行 n

命令,获取下一行 3,执行 p 命令,打印模式空间 3。sed 读取下一行 3,并打印模式空间 3,以此类

推。

4、每三行替换一次

seq 6 |sed 'n;n;s/^/=/;s/$/=/'
seq 6 |sed '3~3{s/^/=/;s/$/=/}'

N 命令的相关功能

seq 6 |sed 'N;q'
#合并两行
seq 6 |sed 'N;s/\n//'

1、奇数行数读取问题

# seq 5 |sed -n N;p
1
2
3
4
# seq 6 |sed -n 'N;p'
1
2
3
4
5
6

为什么第一个不打印 5 呢?

因为 N 命令是读取下一行追加到 sed 读取的当前行,当 N 读取下一行没有内容时,则退出,也不会

执行 p 命令打印当前行。

当行数为偶数时,N 始终就能读到下一行,所以也会执行 p 命令。

处理方案:打印奇数行数时的最后一行

 seq 5 |sed -n '$!N;p'

sed 执行到最后一行时,用感叹号不去执行 N 命令

6) 打印和删除模式空间第一行(P 和 D)

  • P 打印模式空间的第一行。

  • D 删除模式空间的第一行。

1、 打印奇数

seq 6 |sed -n 'N;P'

2、保留最后一行

seq 6 |sed 'N;D'

读取第一行 1,执行 N 命令读取下一行并追加到模式空间,此时模式空间是 1\n2,执行 D 命令删除

模式空间第一行 1,剩余 2。

读取第二行,执行 N 命令,此时模式空间是 3\n4,执行 D 命令删除模式空间第一行 3,剩余 4。

以此类推,读取最后一行打印时,而 N 获取不到下一行则退出,不再执行 D,因此模式空间只剩余 6

就打印。

7) 保持空间操作(h 与 H、g 与 G 和 x)

  • h 复制模式空间内容到保持空间(覆盖)。

  • H 复制模式空间内容追加到保持空间。

  • g 复制保持空间内容到模式空间(覆盖)。

  • G 复制保持空间内容追加到模式空间。

1、 匹配内容的暂存和输出

seq 6 |sed -e '/3/{h;d}' -e '/5/g'
#output
1
2
4
3
6

2、将匹配的内容放到最后

seq 6 |sed -e '/3/{h;d}' -e '$G'

3、交换模式空间和保持空间

seq 6 |sed -e '/3/{h;d}' -e '/5/x' -e '$G'

解读

看后面命令,在模式空间匹配 5 并将保持空间的 3 与 5 交换,5 就变成了 3,。最后把保持空间的 5

追加到模式空间的。

4、倒叙输出 【难点】

seq 5 |sed '1!G;h;$!d'

分析: 1!G 第一行不执行把保持空间内容追加到模式空间,因为现在保持空间还没有数据。

h 将模式空间放到保持空间暂存。

$!d 最后一行不执行删除模式空间的内容。

读取第一行 1 时,跳过 G 命令,执行 h 命令将模式空间 1 复制到保持空间,执行 d 命令删除模式空

间的 1。

读取第二行 2 时,模式空间是 2,执行 G 命令,将保持空间 1 追加到模式空间,此时模式空间是

2\n1,执行 h 命令将 2\n1 覆盖到保持空间,d 删除模式空间。

读取第三行 3 时,模式空间是 3,执行 G 命令,将保持空间 2\n1 追加到模式空间,此时模式空间是

3\n2\n1,执行 h 命令将模式空间内容复制到保持空间,d 删除模式空间。

以此类推读到第 行时模式空间是 执行 命令将保持空间的 追加模式空间

以此类推,读到第 5 行时,模式空间是 5,执行 G 命令,将保持空间的 4\n3\n2\n1 追加模式空间,

然后复制到模式空间,5\n4\n3\n2\n1,不执行 d,模式空间保留,输出。

由此可见,每次读取的行先放到模式空间,再复制到保持空间,d 命令删除模式空间内容,防止输

出,再追加到模式空间,因为追加到模式空间,会追加到新读取的一行的后面,循环这样操作, 就

把所有行一行行追加到新读取行的后面,就形成了倒叙。

5、 每行后面添加新空行

seq 10 |sed G

6、打印匹配行的上一行内容

seq 5 |sed -n '/3/{x;p};h'

解析:

读取第一行 1,没有匹配到 3,不执行{x;p},执行 h 命令将模式空间内容 1 覆盖到保持空间。

读取第二行 2,没有匹配到 3,不执行{x;p},执行 h 命令将模式空间内容 2 覆盖到保持空间。

读取第三行 3,匹配到 3,执行 x 命令把模式空间 3 与保持空间 2 交换,再执行 p 打印模式空间 2.

以此类推。

  • 注意 /3/{x;p} h 是并行的

8) 标签(:、b 和 t)

标签可以控制流,实现分支判断。

: lable name 定义标签

  • b lable 跳转到指定标签,如果没有标签则到脚本末尾
  • t lable 跳转到指定标签,前提是 s///命令执行成功

案例1:将换行符替换成逗号

方法一:

seq 6 |sed ':a;N;s/\n/,/;b a'

行 1,N 命令读取下行 2,此时模式空间是 1\n2$,执行替换,此时模式空间是

1,2$,执行 b 命令再跳转到标签 a 位置继续执行 N 命令,读取下一行 3 追加到模式空间,此时模式

空间是 1,2\n3$,再替换,以此类推,不断追加替换,直到最后一行 N 读不到下一行内容退出。

方法二

seq 6 |sed ':a;N;$!b a;s/\n/,/g'

先将每行读入到模式空间,最后再执行全局替换。$!是如果是最后一行,则不执行 b a 跳转,最后

执行全局替换。

案例2: 每三个数字加个一个逗号

echo "123456789" | sed -r ':a;s/([0-9]{3})([0-9]{3})/\1,\2/;t a'

案例3 忽略大小写

9) y 指定转化

echo "northwest" | sed 'y/north/cARTc/'

12.4.3 awk

是一个处理文本的编程语言工具,能用简短的程序处理标准输入或文件、数据排序、计算以及

生成报表等等

12.4.5 综合案例

1、循环替换端口号

port=7006
while [[ "$port" -gt 7000 ]]
do
        mkdir -p /var/redis/"$port"
        cp ./6379.conf ./"$port".conf
        sed -i ``s/__port__/"$port"/g`` `grep __port__ -rl ./$port.conf`
        echo "port = $port"
        port=$(($port -1 ))
done

12. 5 远程

12.5.1 远程拷贝

1、拷贝远程机器文件夹到本地

scp -r jiangzhaowei@211.154.138.107:/kk/ ./
scp  jiangzhaowei@211.154.138.107:/kk/my.sql  ./

参考资料

第十五章、例行性工作排程(crontab)

仅执行一次的工作排程

循环执行的例行性工作排程

可唤醒停机间工作的排程

第二十章、基础系统设定与备份策略

20.1 系统基本设定

20.1.1 网络设置

常用配置

#hosts地址
/etc/hosts

nmcli

全称是”NetworkManage CommandLine Interface”

#1. nmcli device show 查看网络配置简写
nmcli d show 
#2. nmcli connection show 查看网络状态的简写
nmcli con show
# 3 查看网络设备状态
nmcli dev status 
# 4. 查看网络状态
nmcli dev status
# 5.快速修改连接配置
nmcli con mod “eth0” connection.autoconnect no
nmcli con mod “eth0” ipv4.dns 172.16.0.1
nmcli con mod “eth0” +ipv4.dns 8.8.8.8
nmcli con mod “eth0” -ipv4.dns 8.8.8.8
nmcli con mod “eth0” ipv4.addresses “172.25.X.10/24 172.25.X.254”
nmcli con mod “eth0” +ipv4.addresses 10.10.10.10/16
# 5.1 生效
nmcli con reload
#6 激活和禁用网卡
nmcli con down “system eth0” 可被自动激活
nmcli con up “system eth0”
nmcli dev dis eth0 禁用网卡,访止被自动激活

注意:如果出现Error: NetworkManager is not running. 重启network service sudo /etc/init.d/network-manager restart 修改完成后禁止NetworkMananger systemctl disable NetworkManager

1) 手动设定 IP 网络参数

  1. 查看指定网卡状态 nmcli con show eth0, 重要参数

    connection.autoconnect [yes|no]  :是否于开机时启动这个联机,预设通常是  yes  才对!
    ipv4.method [auto|manual]  :自动还是手动设定网络参数
  2. 设置网络参数 nmcli con modify eth0

    [root@study ~]# nmcli con modify eth0 \ 
    >  connection.autoconnect yes \ 
    >  ipv4.method manual \ 
    >  ipv4.addresses 172.16.1.1/16 \ 
    >  ipv4.gateway 172.16.200.254 \ 
    >  ipv4.dns 172.16.200.254 
  3. 生效 nmcli con up eth0

  4. 验证是否生效 nmcli con show eth0

网络会话配置快速实现IP地址等网络配置的变更

  1. 新增网络会话,ens192nmcli con show name 栏目下的硬件,设置interface-name网络接口

    nmcli con add con-name datacenter-daxing \
    ifname ens192 autoconnect no type ethernet \
    ip4 172.16.60.100/16 \
    gw4 172.16.0.1\
    ipv4.dns 202.101.172.35
  2. 开启会话 nmcli con up datacenter-daxing

  3. 删除会话 nmcli con del datacenter-daxing


第二十一、章 软件安装

常用软件安装

VPN(翻墙)

影梭

Shadowsocks官网 有Client和Server下载,常用配置

Chrome插件:SwitchyOptions.bak下载
Ubuntu直接安装

sudo add-apt-repository ppa:hzwhuang/ss-qt5
sudo apt-get update
sudo apt-get install shadowsocks-qt5
ss-qt5

软件配置及使用

常用配置

  1. Ubuntu下配置支持Windows访问的Samba共享

vim

  • ~/.vimrc

    • hi Comment ctermfg =blue #蓝色注释
    • git config –global core.editor vim
    • 中文乱码 set fencs=utf-8,GB18030,ucs-bom,default,latin1
    • 设置TAB
      set ts=4  (注:ts是tabstop的缩写,设TAB宽4个空格)
      set expandtab
      对于已保存的文件,可以使用下面的方法进行空格和TAB的替换:
      TAB替换为空格:
      :set ts=4
      :set expandtab
      :%retab!
      空格替换为TAB:
      :set ts=4
      :set noexpandtab
      :%retab!
      加!是用于处理非空白字符之后的TAB,即所有的TAB,若不加!,则只处理行首的TAB。
  • 常用命令

    vim FileName +LineNumber == vim + LineNumber Filename

问题解决记录

软件安装

  1. 使用:sudo apt-get install openvswitch-switch 报错
E: Could not get lock /var/lib/dpkg/lock - open (11: Resource temporarily unavailable)
E: Unable to lock the administration directory (/var/lib/dpkg/), is another process using it?

解决:

sudo rm /var/cache/apt/archives/lock
sudo rm /var/lib/dpkg/lock
  1. ubuntu adb 安装
    问题:adb devices: ?????? no permissions解决办法

    lsusb : 查看USB的连接状态

    Bus 001 Device 003: ID 04f2:b5a7 Chicony Electronics Co., Ltd 
    Bus 001 Device 006: ID 05c6:9091 Qualcomm, Inc. 
    Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
    Bus 002 Device 003: ID 0e0f:0002 VMware, Inc. Virtual USB Hub
    Bus 002 Device 002: ID 0e0f:0003 VMware, Inc. Virtual Mouse
    Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub

    设置USB

    # 编辑
    sudo echo '"SUBSYSTEM=="usb", ATTR{idVendor}=="05c6", MODE="0666", GROUP="plugdev""' >>  /etc/udev/rules.d/70-android.rules
    # 重启
    sudo chmod a+rx /etc/udev/rules.d/70-android.rules
    sudo service udev restart
    # adb 重启
    adb kill-server
    adb devices

    以上没有下过的都无效果,查看硬件手动重启USB调试是否正常
    参考: adb devices: ?????? no permissions解决办法

附录

日常解决问题

  • 设置影梭代理

    #1.临时方案
    export ALL_PROXY=socks5://127.0.0.1:1080
    #永久方案
    echo export ALL_PROXY=socks5://127.0.0.1:1080 >> ~/.bash_profile
  • ubuntu 下 su: Authentication failure

    sudo passwd root
    Enter new UNIX password: 
    Retype new UNIX password: 
    passwd: password updated successfully

常用命令

Linux termial shortcut 终端操作快捷键

cmd function
ctrl + a /<- move to line head
ctrl + e/-> move to line tail
ctrl + b /f move back/front a char
alt + b move back a word
ctrl+w delete a word before cursor
alt + d delete a word after cursor
ctrl +k delete all word after cursor

学习资料

博客