一文总结linux基本命令

  1. 查看当前的终端设备:tty

  2. 显示当前使用的shell: echo ${SHELL}

  3. 显示当前系统使用的所有shell: cat /etc/shells

  • sh:Steve Bourne 首个重要的标准Unix Shell
  • bash:Bourne-Again Shell,GPL,CentOS 和 Ubuntu 默认使用
  • csh:c shell , C 语言风格
  • ksh :Korn Shell, AIX 默认 shell
  • zsh: MacOS默认shell
  1. 设置主机名(主机名不要使用下划线 、点)

    • 临时:hostname NAME
    • 永久:hostnamectl set-hostname NAME
  2. 显示命令提示符格式:echo $PS1

    #改命令提示符
    root@centos8 ~]# echo 'PS1="\[\e[1;32m\][\t \[\e[1;33m\]\u\[\e[35m\]@\h\ [\e[1;31m\] \W\[\e[1;32m\]]\[\e[0m\]\\$"' > /etc/profile.d/env.sh
    
  3. 区别指定的命令是内部或外部命令: type COMMAND

  4. 刷新磁盘 echo "- - -" > /sys/class/scsi_host/$HOST/scan ($HOST换实数)

  5. 管理内部命令: enable

    • enable cmd 启用内部命令
    • enable –n cmd 禁用内部命令
    • enable –n 查看所有禁用的内部命令
  6. 查看外部命令路径:which -a |--skip-alias

  7. Hash缓存表:

    • hash 显示hash缓存
    • hash -l 显示hash缓存,可作为输入使用
    • hash -p path name 将命令全路径path起别名为name
    • hash -t name 打印缓存中name的路径
    • hash -d name 清除name缓存
    • hash -r 清除缓存
    • 命令别名: alias
      • alias NAME='VALUE'
    • 撤消别名:unalias
      • unalias [-a] name [name ...]
  8. 日期和时间

    • date 显示和设置(-s)系统时间

      #date +%F 2021-05-19

      #date +%T 17:25:22

    • clock,hwclock: 显示硬件时钟

      • -s, --hctosys 以硬件时钟为准,校正系统时钟
      • -w, --systohc 以系统 时钟为准,校正硬件时钟
    • 显示日历:cal [–y]

      [16:47:36 root@centos8 ~]#cal 9 1752
      September 1752
      Su Mo Tu We Th Fr Sa
              1 2 14 15 16
      17 18 19 20 21 22 23
      24 25 26 27 28 29 30
      
  9. 管理时区:timedatactl

- timedatactl list-timezones 列出支持时区
- timedatactl set-timezones Asia/Shanghai 修改时区
  1. 用户登录信息

    • whoami: 显示当前登录有效用户
    • who: 系统当前所有的登录会话
    • w: 系统当前所有的登录会话及所做的操作
  2. 关机和重启

    • 关机: halt 或 powerof

    • 重启:reboot

    • 关机或重启:shutdown [OPTION]... [TIME] [MESSAGE]

      -r: reboot

      -h: halt

      -c:cancel

      TIME:无指定,默认相当于+1(CentOS7) now: 立刻,相当于+0 +#: 相对时间表示法,几分钟之后;例如 +3 hh:mm: 绝对时间表示

  3. 实现会话管理:screen

    • 创建新screen会话 screen –S [SESSION]
    • 加入screen会话 screen –x [SESSION]
    • 退出并关闭screen会话 exit
    • 剥离当前screen会话 Ctrl+a,d
    • 显示所有已经打开的screen会话 screen -ls
    • 恢复某screen会话 screen -r [SESSION]
  4. 命令行历史:history

    history [-c] [-d offset] [n]
    history -anrw [filename]
    history -ps arg [arg...]
    
    • -c: 清空命令历史
    • -d offset: 删除历史中指定的第offset个命令
    • -n: 显示最近的n条历史
    • -a: 追加本次会话新执行的命令历史列表至历史文件
    • -r: 读历史文件附加到历史列表
    • -w: 保存历史列表到指定的历史文件
    • -n: 读历史文件中未读过的行到历史列表
    • -p: 展开历史参数成多行,但不存在历史列表中
    • -s: 展开历史参数成一行,附加在历史列表后
  5. 调用命令行历史

    • 重复前一个命令使用上方向键,并回车执行
    • 按 !! 并回车执行
    • 输入 !-1 并回车执行
    • 按 Ctrl+p 并回车执行
    • !n 执行history命令输出对应序号n的命令
    • !-n 执行history历史中倒数第n个命令
    • !string 重复前一个以“string”开头的命令
    • !?string 重复前一个包含string的命令
    • !string:p 仅打印命令历史,而不执行
  6. 显示命令的简短描述: whatis:

    刚安装后不可立即使用,需要制作数据库(CentOS 7 版本以后 mandb ,CentOS 6 版本之前 makewhatis)

  7. 提供命令帮助: man

    man [章节] keyword

  8. 查看cpu:lscpu

  9. 查看硬盘: lsblk

  10. 查看内存:free -m

  11. 查看发行版本: cat /etc/os-release 或 lsb_release -a

  12. 查看内核版本: uname -a

  13. 查看进程树: pstree -p

  14. 查看按16进制内容: hexdump -C 文件

  15. 登陆提示:

    • 登陆前:/etc/issue
    • 登陆后: /etc/motd
  16. pwd命令: printing working directory

    • -P 显示真实物理路径
    • -L 显示链接路径(默认)
    • PWD:当前目录路径
    • OLDPWD:上一次目录路径
  17. 列出目录内容:ls ls [options] [files_or_dirs]

- -a(-A) 包含隐藏文件 
- -l 显示额外的信息 
- -R 目录递归 
- -ld 目录和符号链接信息 
- -1 文件分行显示 
- -S 按从大到小排序 
- -t 按mtime(内容修改时间)排序 
- -u 配合-t选项,显示并按atime(访问时间)从新到旧排序 
- -U 按目录存放顺序显示 
- -X 按文件后缀排序
- -F 按类型加后缀显示
- -r 倒序
  1. 查看文件状态 stat

    • access time 访问时间,atime,读取文件内容
    • modify time 修改时间,mtime,改变文件内容(数据)
    • change time 改变时间,ctime,元数据发生改变
  2. 确定文件类型: file file [options] ...

    • -b 列出文件辨识结果时,不显示文件名称
    • -f filelist 列出文件filelist中文件名的文件类型
    • -F 使用指定分隔符号替换输出文件名后默认的”:”分隔符
    • -L 查看对应软链接对应文件的文件类型
  3. 将windows10上文本默认的编码转换成UTF-8:iconv -f gb2312 win.txt -o win2.txt

  4. 将windows的文本格式转换成Linux的文本格式:dos2unix windows.txt

  5. 创建空文件和刷新时间:touch touch [OPTION]... FILE...

    • -a 仅改变 atime和ctime
    • -m 仅改变 mtime和ctime
    • -t [[CC]YY]MMDDhhmm[.ss] 指定atime和mtime的时间戳
    • -c 如果文件不存在,则不予创建
  6. 复制文件和目录:cp

    cp [OPTION]... [-T] SOURCE DEST
    cp [OPTION]... SOURCE... DIRECTORY
    cp [OPTION]... -t DIRECTORY SOURCE...
    
    • -i 覆盖前提示
    • -n 不覆盖,注意两者顺序
    • -r, -R 递归复制目录及内部的所有内容
    • -a 归档,相当于-dR --preserv=all
    • -d --no-dereference --preserv=links 不复制原文件,只复制链接名
    • --preserv[=ATTR_LIST]
      • mode: 权限
      • ownership: 属主属组
      • timestamp: stat时间
      • links
      • xattr
      • context
      • all
    • -p 等同--preserv=mode,ownership,timestamp
    • -v --verbose 详情
    • -f --force
    • -u --update 只复制源比目标更加新的文件或目标不存在的文件
    • -b 目标存在,覆盖前先备份,形式为 filename~
    • --backup=numbered 目标存在,覆盖前先备份加数字后缀
  7. 移动和重命名文件:mv

    mv [OPTION]... [-T] SOURCE DEST
    mv [OPTION]... SOURCE... DIRECTORY
    mv [OPTION]... -t DIRECTORY SOURCE...
    
    • -i 交互式
    • -f 强制
    • -b 目标存在,覆盖前先备份
  8. rename 批量修改文件名

    rename [options] <expression> <replacement> <file>...
    
    #为所有的conf文件加上.bak后缀:
    rename 'conf' 'conf.bak' f*
    #去掉所有的bak后缀:
    rename '.bak' '' *.bak
    
  9. 显示目录树 tree

    • -d: 只显示目录
    • -L level:指定显示的层级数目
    • -P pattern: 只显示由指定wild-card pattern匹配到的路径
  10. 创建目录mkdir

    • -p: 存在于不报错,且可自动创建所需的各目录
    • -v: 显示详细信息
    • -m MODE: 创建目录时直接指定权限
  11. 删除空目录 rmdir

  12. 链接 ln filename [linkname ]

    硬链接特点

    • 创建硬链接会增加额外的记录项以引用文件
    • 对应于同一文件系统上一个物理文件
    • 每个目录引用相同的inode号
    • 创建时链接数递增
    • 删除文件时:rm命令递减计数的链接,文件要存在,至少有一个链接数,当链接数为零时,该文 件被删除
    • 不能跨越驱动器或分区
    • 不支持对目录创建硬链接

    软链接特点

    • 一个符号链接的内容是它引用文件的名称
    • 可以对目录创建软链接
    • 可以跨分区的文件实现
    • 引用b同的inode号
    • 指向的是另一个文件的路径;其大小为指向的路径字符串的长度;不增加或减少目标文件inode的 引用计数
    • 软链接如果使用相对路径,是相对于原文件的路径,而非相对于当前目录
  13. 标准输出和错误重新定向: >

    • 1> 或 > 把STDOUT重定向到文件

    • >| 强制覆盖

    • 2> 把STDERR重定向到文件

    • &> 把所有输出重定向到文件

    • >> 追加标准输出重定向至文件

    • 2>> 追加标准错误重定向至文件

      cat /dev/null > /data/file.logsh
      
  14. 转换和删除字符: tr tr [OPTION]... SET1 [SET2]

    • -c –C --complement:取字符集的补集

    • -d --delete:删除所有属于第一字符集的字符

    • -s --squeeze-repeats:把连续重复的字符以单独一个字符表示,即去重

    • -t --truncate-set1:将第一个字符集对应字符转化为第二字符集对应的字符

    #该命令会把/etc/issue中的小写字符都转换成大写字符
    tr ‘a-z’ ‘A-Z’< /etc/issue
    #删除fstab文件中的所有abc中任意字符
    tr –d abc < /etc/fstab
    #转换windows文本到linux文本
    tr -d '\r' < windows.txt > windows2.txt
    
  15. 标准输入重定向: <

    [root@centos8 ~]#echo 2^3 > bc.log
    [root@centos8 ~]#cat bc.log
    2^3
    [root@centos8 ~]#bc < bc.log
    8
    
  16. 多行重定向: <<

    mail -s "Please Call" admin@magedu.com <<EOF
    > Hi Wang
    >
    > Please give me a call when you get in. We may need
    > to do some maintenance on server1.
    >
    > Details when you're on-site
    > Zhang
    
  17. 管道: 命令1 | 命令2 | 命令3 | …

```shell
# 标准和错误输出都传递
[root@centos8 ~]#ls /data /xxx 2>&1 | tr 'a-z' 'A-Z'
LS: CANNOT ACCESS '/XXX': NO SUCH FILE OR DIRECTORY
/DATA:
ALL.LOG
F1.TXT
PASSWD.LOG
STERR.LOG
STOUT.LOG
TEST.LOG
TOUCH.LOG
# 从文件读取内容改密码(非交互式)
[root@centos8 ~]#cat p.txt | passwd --stdin wang
Changing password for user wang.
passwd: all authentication tokens updated successfully.
# 从字符串读取内容改密码
[root@centos8 ~]#echo magedu | passwd --stdin wang
Changing password for user wang.
passwd: all authentication tokens updated successfully.
#取消完成提示
[root@centos8 ~]#echo magedu | passwd --stdin wang &> /dev/null
```
  1. 重定向到多个目标:tee 命令1 | tee [-a ] 文件名 | 命令2

    [root@centos8 ~]#cat <<EOF | tee /etc/motd
    > welcome to magedu
    > happy new year
    > EOF
    welcome to magedu
    happy new year
    
  2. 生成序列:seq (-s指定分隔符)

    #生成1-100并相加
    [root@centos8 ~]#seq -s + 1 100 |bc
    5050
    
  3. 用户管理命令

    • useradd useradd [options] LOGIN
      • -u UID
      • -o 配合-u 选项,不检查UID的唯一性
      • -g GID 指明用户所属基本组,可为组名,也可以GID
      • -c "COMMENT“ 用户的注释信息
      • -d HOME_DIR 以指定的路径(不存在)为家目录
      • -s SHELL 指明用户的默认shell程序,可用列表在/etc/shells文件中
      • -G GROUP1[,GROUP2,...] 为用户指明附加组,组须事先存在
      • -N 不创建私用组做主组,使用users组做主组
      • -r 创建系统用户 CentOS 6之前: ID<500,CentOS 7以后: ID<1000
      • -m 创建家目录,用于系统用户
      • -M 不创建家目录,用于非系统用户
    • usermod usermod [OPTION] LOGIN
    • userdel userdel [OPTION]... Login
      • -f, --force 强制
      • -r, --remove 删除用户家目录和邮箱
    • groupadd
      • -g GID 指明GID号;[GID_MIN, GID_MAX]
      • -r 创建系统组,CentOS 6之前: ID<500,CentOS 7以后: ID<1000
    • groupmod
    • groupdel
  4. 查看用户相关的ID信息 id id [OPTION]... [USER]

    • -u: 显示UID
    • -g: 显示GID
    • -G: 显示用户所属的组的ID
    • -n: 显示名称,需配合ugG使用
  5. 设置密码 passwd passwd [OPTIONS] UserName

    • -d:删除指定用户密码
    • -l:锁定指定用户
    • u:解锁指定用户
    • -e:强制用户下次登录修改密码
    • -f:强制操作
    • -n mindays:指定最短使用期限
    • -x maxdays:最大使用期限
    • -w warndays:提前多少天开始警告
    • -i inactivedays:非活动期限
    • --stdin:从标准输入接收用户密码
  6. 修改用户密码策略 chage [OPTION]... LOGIN

    • -d LAST_DAY

    • -m --mindays MIN_DAYS

    • -M --maxdays MAX_DAYS

    • -W --warndays WARN_DAYS

    • -I --inactive INACTIVE 密码过期后的宽限期

    • -E --expiredate EXPIRE_DATE 用户的有效期

    • 换个身份执行命令:su [-] UserName -c 'COMMAND'

      [wang@centos8 ~]$su - root -c "getent shadow"
      
  7. 设置文件的所有者chown

```
chown [OPTION]... [OWNER][:[GROUP]] FILE...
chown [OPTION]... --reference=RFILE FILE...
```

- OWNER 只修改所有者 
- OWNER:GROUP 同时修改所有者和属组
-  :GROUP 只修改属组,冒号也可用 . 替换 
- -R: 递归 
- --reference=RFILE 参考指定的的属性,来修改 
  1. 设置文件的属组信息chgrp
```
chgrp [OPTION]... GROUP FILE...
chgrp [OPTION]... --reference=RFILE FILE...
```
  1. 修改文件权限chmod
```
chmod [OPTION]... OCTAL-MODE FILE...
chmod [OPTION]... MODE[,MODE]... FILE...
#参考RFILE文件的权限,将FILE的修改为同RFILE
chmod [OPTION]... --reference=RFILE FILE...
```

> MODE: 
>
> 修改一类用户的所有权限 u= g= o= ug= a= u=,g=
>
> 修改一类用户某位或某些位权限 u+ u- g+ g- o+ o- a+ a- + 
  1. 新建文件和目录的默认权限 umask

    • 新建文件的默认权限: 666-umask,如果所得结果某位存在执行(奇数)权限,则将其权限+1,偶 数不变

    • 新建目录的默认权限: 777-umask

      #查看umask
      umask
      #模式方式显示
      umask –S
      #输出可被调用
      umask –p
      
  2. 特殊权限 Sticky 位

    具有写权限的目录通常用户可以删除该目录中的任何文件,无论该文件的权限或拥有权 在目录设置Sticky 位,只有文件的所有者或root可以删除该文件 sticky 设置在文件上无意义

    chmod o+t DIR...
    chmod 1xxx DIR
    chmod o-t DIR...
    
    权限位映射
    SUID: user,占据属主的执行权限位
    s:属主拥有x权限
    S:属主没有x权限
    SGID: group,占据属组的执行权限位
    s: group拥有x权限
    S:group没有x权限
    Sticky: other,占据other的执行权限位
    t:other拥有x权限
    T:other没有x权限
    
  3. 设定文件特殊属性 chattr

    设置文件的特殊属性,可以访问root 用户误操作删除或修改文件

    不能删除,改名,更改

    chattr +i
    

    只能追加内容

    chattr +a
    

    显示特定属性

    lsattr
    
  4. ACL相关命令

    • setfacl 设置ACL权限

    • getfacl 可查看设置的ACL权限

    • mask 权限,只影响除所有者和other的之外的人和组的最大权限,需要与用户的权限进行逻辑与运算后,才能变成有限的权限(Effective Permission)

      [root@centos8 data]#setfacl -m u:wang:- f1.txt
      [root@centos8 data]#ll
      total 4
      -rw-r--r--+ 1 root root 709 Dec 18 14:37 f1.txt
      [root@centos8 data]#getfacl f1.txt
      # file: f1.txt
      # owner: root
      # group: root
      user::rw-
      user:wang:---
      group::r--
      mask::r--
      other::r--
      
  1. 查看非文本内容

    #16进制方式查看设备
    [root@ruipeng ~]# hexdump -C -n 512 /dev/vda1
    00000000  58 46 53 42 00 00 10 00  00 00 00 00 00 ef fe fb  |XFSB............|
    .......
    *
    00000200
    #od 即 dump files in octal and other formats
    [root@ruipeng ~]# echo {a..z}|tr -d ' '|od -t x1z
    0000000 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70  >abcdefghijklmnop<
    0000020 71 72 73 74 75 76 77 78 79 7a 0a                 >qrstuvwxyz.<
    0000033
    
  2. 分页查看工具: more less

    • more [OPTIONS...] FILE...
      • -d: 显示翻页及退出提示
    • less 也可以实现分页查看文件或STDIN输出
  3. 显示文本前或后行内容 head tail

    • head [OPTION]... [FILE]...

      -c # 指定获取前#字节

      -n # 指定获取前#行

    • tail [OPTION]... [FILE]...

      -c # 指定获取后#字节

      -n # 指定获取后#行

      -# 同上

      -f 跟踪显示文件fd新追加的内容,常用日志监控,相当于 --follow=descriptor,当文件删除再新建同名文 件,将无法继续跟踪文件

      -F 跟踪文件名,相当于--follow=name --retry,当文件删除再新建同名文件,将可以继续跟踪文件

  4. 按列抽取文本: cut cut [OPTION]... [FILE]...

    • -d DELIMITER: 指明分隔符,默认tab
    • -f FILEDS:
      • : 第#个字段,例如:3

      • ,#[,#]:离散的多个字段,例如:1,3,6

      • -#:连续的多个字段, 例如:1-6 混合使用:1-3,7

    • -c 按字符切割
    • --output-delimiter=STRING指定输出分隔符
  5. paste 合并多个文件同行号的列到一行 paste 合并多个文件同行号的列到一行

    • -d 分隔符:指定分隔符,默认用TAB

    • -s : 所有行合成一行显示

      [root@centos8 ~]#paste -d":" alpha.log seq.log 
      a:1
      b:2
      c:3
      d:4
      e:5
      f:
      g:
      h:
      [root@centos8 ~]#paste -s seq.log
      1 2 3 4 5
      [root@centos8 ~]#paste -s alpha.log 
      a b c d e f g h
      [root@centos8 ~]#paste -s alpha.log seq.log
      a b c d e f g h
      1 2 3 4 5
      
  6. 文本数据统计:wc

    • -l 只计数行数

    • -w 只计数单词总数

    • -c 只计数字节总数 -

    • m 只计数字符总数

    • -L 显示文件中最长行的长度

      wc story.txt 
      39     237    1901 story.txt
      行数   单词数   字节数
      
      [root@centos8 ~]#wc -l title.txt 
      3 title.txt
      [root@centos8 ~]#cat title.txt | wc -l
      3
      
  7. 文本排序sort sort [options] file(s)

    • -r 执行反方向(由上至下)整理

    • -R 随机排序 -n 执行按数字大小整理

    • -f 选项忽略(fold)字符串中的字符大小写

    • -u 选项(独特,unique)删除输出中的重复行

    • -t c 选项使用c符号做为字段界定符

    • -k # 选项按照使用c字符分隔的 # 列来整理能够使用多次

      #按用户id从大到小排序
      [root@ruipeng data]# cut -d:  -f1,3 passwd |sort -t: -k2 -nr
      nobody:65534
      admin:1000
      systemd-coredump:999
      polkitd:998
      ......
      root:0
      #统计访问量(ip要去重)
      cut -d" " -f1 access_log|sort -u|wc -l
      
  8. 去重(连续)uniq uniq [OPTION]... [FILE]...

- -c: 显示每行重复出现的次数 

- -d: 仅显示重复过的行 

- -u: 仅显示不曾重复的行

  ```sh
  #统计日志访问最高的前三IP
  [root@centos8 data]#cut -d" " -f1 access_log |sort |uniq -c|sort -nr |head -3
     4870 172.20.116.228
     3429 172.20.116.208
     2834 172.20.0.222
  ```
  1. 比较文件 diff

    patch 复制在其它文件中进行的改变(要谨慎使用)

    [root@centos8 ~]#diff -u f1.txt f2.txt 
    --- f1.txt 2019-12-13 21:31:30.892775671 +0800
    +++ f2.txt 2019-12-13 22:00:14.373677728 +0800
    @@ -1,4 +1,5 @@
    -mage
    -zhang
    +magedu
    +zhang sir
     wang
     xu
    +shi
    #通过diff结果找回文件 -b选项来自动备份改变了的文件.orig 
    [root@centos8 ~]#diff -u f1.txt f2.txt > f.patch
    [root@centos8 ~]#rm -f f2.txt 
    [root@centos8 ~]#patch -b f1.txt f.patch 
    patching file f1.txt
    
  2. 查看二进制文件的不同 cpm

    [root@centos8 ~]#cmp /bin/dir /bin/ls
    /bin/dir /bin/ls differ: byte 737, line 2
    [root@centos8 ~]#hexdump -s 730 -Cn 7 /bin/dir
    000002da  00 00 47 4e 55 00 b0                             |..GNU..|
    000002e1
    [root@centos8 ~]#hexdump -s 730 -Cn 7 /bin/ls 
    000002da  00 00 47 4e 55 00 93                             |..GNU..|
    000002e1
    
  1. grep 对文本的(正则表达式)行基于模式进行过滤grep [OPTIONS] PATTERN [FILE...]

    • --color=auto 对匹配到的文本着色显示

    • -m # 匹配#次后停止

    • -v 显示不被pattern匹配到的行

    • -i 忽略字符大小写

    • -n 显示匹配的行号

    • -c 统计匹配的行数

    • -o 仅显示匹配到的字符串

    • -q 静默模式,不输出任何信息

    • -A # after, 后#行

    • -B # before, 前#行

    • -C # context, 前后各#行

    • -e 实现多个选项间的逻辑or关系,如:grep –e ‘cat ’ -e ‘dog’ file

    • -w 匹配整个单词

    • -E 使用ERE,相当于egrep

    • -F 相当于fgrep,不支持正则表达式

    • -f file 根据模式文件处理(从文件读取re)

    • -r 递归目录,但不处理软链接

    • -R 递归目录,但处理软链接

      #分区最高利用率
      [root@ruipeng ~]# df | grep '^/dev' |tr -s ' ' %|cut -d% -f5|sort -n
      5
      #查看当前连接次数最多的ip
      [root@centos8 ~]#ss -nt | grep "^ESTAB" |tr -s ' ' : |cut -d: -f6|sort |uniq -c|sort -nr|head -n3
            3 10.0.0.1
            1 172.16.4.100
            1 172.16.31.188
      #去除注释和空行
      grep -v "^#\|^$" /etc/profile
      grep -Ev "^(#|$)" /etc/profile
      egrep -v "^(#|$)" /etc/profile
      #过滤ifconfig的IP地址
      [root@ruipeng ~]# ifconfig | grep -Eo '([0-9]{1,3}\.){3}[0-9]{1,3}'
      172.26.19.212
      255.255.192.0
      172.26.63.255
      127.0.0.1
      255.0.0.0
      #显示查找该结果及前后三行
      [root@ruipeng data]# grep -nC3 games passwd
      8-halt:x:7:0:halt:/sbin:/sbin/halt
      9-mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
      10-operator:x:11:0:operator:/root:/sbin/nologin
      11:games:x:12:100:games:/usr/games:/sbin/nologin
      12-ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
      13-nobody:x:65534:65534:Kernel Overflow User:/:/sbin/nologin
      14-dbus:x:81:81:System message bus:/:/sbin/nologin
      #按单词过滤
      [root@ruipeng data]# grep -w  bin passwd
      root:x:0:0:root:/root:/bin/bash
      bin:x:1:1:bin:/bin:/sbin/nologin
      sync:x:5:0:sync:/sbin:/bin/sync
      admin:x:1000:1000::/home/admin:/bin/bash
      
      
  2. locate 非实时查找(数据库查找):locate [OPTION]... [PATTERN]...

    locate 查询系统上预建的文件索引数据库 /var/lib/mlocate/mlocate.db 索引的构建是在系统较为空闲时自动进行(周期性任务),执行updatedb可以更新数据库 索引构建过程需要遍历整个根文件系统,很消耗资源

    • -i 不区分大小写的搜索

    • -n N 只列举前N个匹配项目

    • -r 使用基本正则表达式

      #搜索名称或路径中包含“conf”的文件
      locate conf
      #使用Regex来搜索以“.conf”结尾的文件
      locate -r '\.conf$'
      
  3. find 实时查找工具,通过遍历指定路径完成文件查找 find [OPTION]... [查找路径] [查找条件] [处理动作]

    • -maxdepth level 最大搜索目录深度,指定目录下的文件为第1级
    • -mindepth level 最小搜索目录深度
    • -depth -d 每个目录先处理目录内的文件,再处理目录本身(深度相反)
    • -name "文件名称":支持使用glob,如:*, ?, [], [^]
    • -iname "文件名称":不区分字母大小写
    • -inum n 按inode号查找
    • -samefile name 相同inode号的文件
    • -links n 链接数为n的文件
    • -regex “PATTERN”:以PATTERN匹配整个文件路径,而非文件名
    • 根据属主、属组查找 -user USERNAME:查找属主为指定用户(UID)的文件 -group GRPNAME: 查找属组为指定组(GID)的文件 -uid UserID:查找属主为指定的UID号的文件 -gid GroupID:查找属组为指定的GID号的文件 -nouser:查找没有属主的文件 -nogroup:查找没有属组的文件
    • 组合条件 与:-a 或:-o 非:-not !
    • -path 排除目录
    • -type TYPE 根据文件类型查找
      • f: 普通文件
      • d: 目录文件
      • l: 符号链接文件
      • s:套接字文件
      • b: 块设备文件
      • c: 字符设备文件
      • p: 管道文件
    [root@centos8 data]#find -regex ".*\.txt$"
    ./script40/b.txt
    ./f1.txt
    #查找/etc/下,除/etc/sane.d目录的其它所有.conf后缀的文件
    find /etc -path '/etc/sane.d' -a -prune -o -name "*.conf"
    #查找/etc/下,除/etc/sane.d和/etc/fonts两个目录的所有.conf后缀的文件
    find /etc \( -path "/etc/sane.d" -o -path "/etc/fonts" \) -a -prune -o -name "*.conf
    
    • 根据时间戳 以“天”为单位
      • -atime [+|-]# #: [#,#+1) +#: [#+1,∞] -#: [0,#)
      • -mtime
      • -ctime
      • 以“分钟”为单位 : -amin -mmin -cmin
  4. 参数替换 xargs

    find | xargs COMMAND

    [root@ruipeng data]# find -name "*.sh" | xargs ls -Sl
    -rw-r--r-- 1 root root 876 Jun  1 22:58 ./test.sh
    -rw-r--r-- 1 root root   0 Jun  7 22:50 ./10.sh
    -rw-r--r-- 1 root root   0 Jun  7 22:50 ./110.sh
    -rw-r--r-- 1 root root   0 Jun  7 22:50 ./11.sh
    .....
    #竖向显示
    [root@ruipeng data]# echo {1..10} |xargs -n1
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #并发执行多个进程
    [root@ruipeng data]# seq 100 |xargs -i -P10 wget -P /data http://10.0.0.8/{}.html
    --2021-06-07 22:54:17--  http://10.0.0.8/4.html
    Connecting to 10.0.0.8:80... --2021-06-07 22:54:17--  http://10.0.0.8/2.html
    Connecting to 10.0.0.8:80... --2021-06-07 22:54:17--  http://10.0.0.8/3.html
    Connecting to 10.0.0.8:80... --2021-06-07 22:54:17--  http://10.0.0.8/5.html
    Connecting to 10.0.0.8:80... --2021-06-07 22:54:17--  http://10.0.0.8/1.html
    Connecting to 10.0.0.8:80... --2021-06-07 22:54:17--  http://10.0.0.8/6.html
    Connecting to 10.0.0.8:80... --2021-06-07 22:54:17--  http://10.0.0.8/7.html
    Connecting to 10.0.0.8:80... --2021-06-07 22:54:17--  http://10.0.0.8/8.html
    Connecting to 10.0.0.8:80... --2021-06-07 22:54:17--  http://10.0.0.8/9.html
    Connecting to 10.0.0.8:80... --2021-06-07 22:54:17--  http://10.0.0.8/10.html
    
  5. 压缩解压缩

    • compress和uncompress compress Options [file ...]

      • -d 解压缩,相当于uncompress
      • -c 结果输出至标准输出,不删除原文件
      • -v 显示详情
    • gzip和gunzip gzip [OPTION]... FILE ...

      • -d 解压缩,相当于gunzip

      • -c 结果输出至标准输出,保留原文件不改变

      • -# 指定压缩比,#取值为1-9,值越大压缩比越大

        cat messages | gzip > m.gz :内容压缩

        zcat file.gz 不显式解压缩的前提下查看文本文件内容

    • bzip2和bunzip2(非系统自带) bzip2 [OPTION]... FILE ...

    • -k keep, 保留原文件

    • -d 解压缩

    • -c 结果输出至标准输出,保留原文件不改变

    • -# 1-9,压缩比,默认为9

      bunzip2 file.bz2 解压缩

      bzcat file.bz2 不显式解压缩的前提下查看文本文件内容

    • xz和unxz xz [OPTION]... FILE ...

      • -k keep, 保留原文件

      • -d 解压缩

      • -c 结果输出至标准输出,保留原文件不改变

      • -# 压缩比,取值1-9,默认为6

      unxz file.xz 解压缩

      xzcat file.xz 不显式解压缩的前提下查看文本文件内容

    • zip和unzip

      #打包并压缩
      zip –r /backup/sysconfig.zip /etc/sysconfig/
      #默认解压缩至当前目录
      unzip /backup/sysconfig.zip
      #解压缩至指定目录
      unzip /backup/sysconfig.zip -d /tmp
      cat /var/log/messages | zip messages -
      unzip -p message.gz > message #-p 表示管道
      
    • 打包和解包 tar 磁带归档(Tape ARchive),常用于备份 tar -cpvf /PATH/FILE.tar FILE...

      (1) 创建归档,保留权限

      tar -cpvf /PATH/FILE.tar FILE...

      (2) 追加文件至归档: 注:不支持对压缩文件追加

      tar -rf /PATH/FILE.tar FILE...

      (3) 查看归档文件中的文件列表

      tar -t -f /PATH/FILE.tar

      (4) 展开归档

      tar xf /PATH/FILE.tar tar xf /PATH/FILE.tar -C /PATH/

      (5) 结合压缩工具实现:

      • -z 相当于gzip压缩工具
      • -j 相当于bzip2压缩工具
      • -J 相当于xz压缩工具
      [root@centos8 ~]#tar zcvf etc.tar.gz /etc/
      [root@centos8 ~]#tar jcvf etc.tar.bz2 /etc/
      [root@centos8 ~]#tar Jcvf etc.tar.xz /etc/
      

      --exclude 排除文件

      tar zcvf /root/a.tgz --exclude=/app/host1 --exclude=/app/host2 /app
      
      • -T 选项指定输入文件
      • -X 选项指定包含要排除的文件列表

    注意:在指定排除目录的时候,目录的话结尾不能带/否则将会排除失败。比如--exclude=tomcat/logs如果写成--exclude=tomcat/logs/,则打包的时候还是会打进去。

  6. sed 即 stream EDitor,行编辑器 sed [option]... 'script;script;...' inputfile...

    • -n 不输出模式空间内容到屏幕,即不自动打印
    • -e 多点编辑
    • -f /PATH/SCRIPT_FILE 从指定文件中读取编辑脚本
    • -r, -E 使用扩展正则表达式
    • -i.bak 备份文件并原处编辑
    • script格式:'地址命令'

    地址:

    1. 不给地址:对全文进行处理
    2. 单地址:
       #:指定的行,$:最后一行
       /pattern/:被此处模式所能够匹配到的每一行
    3. 地址范围:
       #,#
       #,+#
       /pat1/,/pat2/
       #,/pat/
    4. 步进:~
      1~2 奇数行
      2~2 偶数行
    

    命令:

    p 打印当前模式空间内容,追加到默认输出之后
    d 删除模式空间匹配的行,并立即启用下一轮循环
    a [\\]text 在指定行后面追加文本,支持使用\n实现多行追加
    i [\\]text 在行前面插入文本
    c [\\]text 替换行为单行或多行文本
    w /path/file 保存模式匹配的行至指定文件
    r /path/file 读取指定文件的文本至模式空间中匹配到的行后
    = 为模式空间中的行打印行号
    ! 模式空间中匹配行取反处理
    s/pattern/string/修饰符 查找替换,支持使用其它分隔符,可以是其它形式:s@@@,s###
    替换修饰符:
        g 行内全局替换
        p 显示替换成功的行
        w   /PATH/FILE 将替换成功的行保存至文件中
    
  7. awk 格式化文本输出
    awk [options] 'program' var=value file…
    awk [options] -f programfile var=value file…

    program通常是被放在单引号中,并可以由BEGIN语句块、模式匹配的通用语句块、END语句块组成

    • -F “分隔符” 指明输入时用到的字段分隔符
    • -v var=value 变量赋值
    [root@centos8 ~]#awk    '{print "hello,awk"}'
    [root@centos8 ~]#awk -F: '{print "wang"}' /etc/passwd
    [root@centos8 ~]#awk -F: '{print}' /etc/passwd
    [root@centos8 ~]#awk -F: '{print 0}' /etc/passwd
    [root@centos8 ~]#awk -F: '{print1,3}' /etc/passwd
    [root@centos8 ~]#awk -F: '{print1"\t"3}' /etc/passwd
    [root@centos8 ~]#grep "^UUID" /etc/fstab |awk {'print2,3'}
    / xfs
    /boot ext4
    /data xfs
    swap swap
    [root@centos8 ~]#awk '{print1}' access_log |sort |uniq -c|sort -nr|head 
       4870 172.20.116.228
       3429 172.20.116.208
       2834 172.20.0.222
       2613 172.20.112.14
       2267 172.20.0.227
       2262 172.20.116.179
       2259 172.20.65.65
       1565 172.20.0.76
       1482 172.20.0.200
       1110 172.20.28.145
    
    [root@centos8 ~]#df | awk -F"[[:space:]]+|%" '{print 5}'
    Use
    0
    0
    1
    0
    5
    1
    92
    1
    [root@centos8 ~]#df | grep "^/dev/sd" | awk -F"[[:space:]]+|%" '{print5}'
    5
    1
    92
    
    [root@centos8 ~]#df |  awk -F"[[:space:]]+|%" '/^\/dev\/sd/{print $5}'
    5
    1
    92
    

    awk内置变量

    FS:输入字段分隔符,默认为空白字符,功能相当于 -F

    #user uid shell
    [root@localhost ~]# awk -F:  '{print $1,$3,$7}'   /etc/passwd
    #user:uid
    [root@localhost ~]# awk -v FS=":" '{print $1FS$3}' /etc/passwd
    

    OFS:输出字段分隔符,默认为空白字符

    [root@localhost ~]# awk  -v FS=':'  -v OFS='#'  '{print $1,$3,$7}'   /etc/passwd
    

    RS:输入记录分隔符,指定输入时的换行符

    awk -v RS=' ' '{print }' /etc/passwd
    ORS:输出记录分隔符,输出时用指定符号代替换行符

    [root@localhost ~]#  awk -v RS=' ' -v ORS='--'  '{print $0}' /etc/passwd
    root:x:0:0:root:/root:/bin/bash
    bin:x:1:1:bin:/bin:/sbin/nologin
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    adm:x:3:4:adm:/var/adm:/sbin/nologin
    lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
    sync:x:5:0:sync:/sbin:/bin/sync
    shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
    halt:x:7:0:halt:/sbin:/sbin/halt
    mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
    operator:x:11:0:operator:/root:/sbin/nologin
    games:x:12:100:games:/usr/games:/sbin/nologin
    ftp:x:14:50:FTP--User:/var/ftp:/sbin/nologin
    nobody:x:65534:65534:Kernel--Overflow--User:/:/sbin/nologin
    sshd:x:74:74:Privilege-separated--SSH:/var/empty/sshd:/sbin/nologin
    unbound:x:999:993:Unbound--DNS--resolver:/etc/unbound:/sbin/nologin
    polkitd:x:998:992:User--for--polkitd:/:/sbin/nologin
    ……
    

    NF:字段数量

    [root@localhost ~]# awk  '{print NF}' /etc/fstab 
    0
    1
    2
    10
    1
    9
    12
    1
    11
    6
    1
    6
    6
    6
    

    NR:记录编号

    [root@localhost ~]# awk -F: '{print NR}' /etc/passwd
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    ……
    

    FNR:多个文件分别计数,记录号

    [root@localhost ~]# awk '{print FNR}'  /etc/fstab /etc/inittab
    1
    2
    3
    ……
    14
    1
    2
    3
    4
    ……
    12
    [root@ruipeng ~]# awk  '{print FNR,$0}' /etc/issue /etc/redhat-release 
    1 \S
    2 Kernel \r on an \m
    3 
    1 CentOS Linux release 8.2.2004 (Core) 
    

    FILENAME:当前文件名

    [root@ruipeng ~]# awk  '{print FNR,FILENAME,$0}' /etc/issue /etc/redhat-release 
    1 /etc/issue \S
    2 /etc/issue Kernel \r on an \m
    3 /etc/issue 
    1 /etc/redhat-release CentOS Linux release 8.2.2004 (Core)
    

    自定义变量(区分字符大小写),在program中直接定义

    • -v var=value
    [root@ruipeng ~]# awk  -v test='hello gawk' '{print test}' /etc/fstab
    hello gawk
    hello gawk
    hello gawk
    ……
    
  8. split分割一个文件为多个文件

    #分割大的 tar 文件为多份小文件 
    split -b Size –d tar-file-name prefix-name 
    split -b 1M mybackup.tgz mybackup-parts 
    #切换成的多个小分文件使用数字后缀 
    split -b 1M –d mybackup.tgz mybackup-parts
    
    #合并
    cat mybackup-parts* > mybackup.tar.gz
    
  9. 包管理器rpm rpm {-i|--install} [install-options] PACKAGE_FILE…

    • -v: verbose
    • -vv:更详细
    • -h: 以#显示程序包管理执行进度
    • [install-options]
      • --test: 测试安装,但不真正执行安装,即dry run模式
      • --nodeps:忽略依赖关系
      • --replacepkgs | replacefiles
      • --nosignature: 不检查来源合法性
      • --nodigest:不检查包完整性
      • --noscripts:不执行程序包脚本
        • %pre: 安装前脚本 --nopre
        • %post: 安装后脚本 --nopost
        • %preun: 卸载前脚本 --nopreun
        • %postun: 卸载后脚本 --nopostun
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容