快乐的shell命令行

快乐的shell命令行

PART1——基础

1.权限

  • #超级用户权限
  • $普通用户

2.复制粘贴

  • 复制:鼠标左键沿着文本拖动高亮的文本被复制到X管理的缓冲区(或者双击一个单词)
  • 粘贴:鼠标中键

3.简单命令

  • 时间和日期date
  • 当前月份的日历cal
  • 磁盘剩余空间的数量df
  • 空闲内存的数量free
  • 结束终端exit
  • 打印

PART2——文件

目录

  • 系统程序安装目录/usr/bin

  • 家目录~

~ 家目录
/ 根目录
/bin 系统启动和运行必须的二进制程序
/boot Linux内核、初始RAM磁盘映像和启动加载程序
/dev 设备节点,内核在此目录维护所有设备的列表
/etc 系统层面的配置文件,包含一系列的shell脚本(/etc/crontab,定义自动运行的任务)(/etc/passwd,用户账号列表)
/lib 核心系统程序所使用的共享库文件(Windows中的动态链接库)
/media 可移动介质的挂载点
/mnt 早些linux系统中的可移动介质的挂载点
/opt 安装可选软件
/proc 一个由Linu系统维护的虚拟文件系统
/sbin 为超级用户保留的系统二进制文件
/usr 普通用户所需要的所有程序和文件
/usr/bin 系统安装的可执行程序
/usr/lib /usr/bin中程序的共享库
/usr/local 通常由源码编译的程序回安装在/usr/local/bin下

PART3——系统

ls

选项 长选项 描述
-a –all 列出所有文件(包括隐藏文件)
-l 以长格式显示结果
-t 按照修改时间排序
-h –human-readable 当以长格式列出时,以人们可读的方式展示
-d –directory 可以看到目录的详细信息
-r –reverse 以相反的顺序显示结果,ls通常是按字母升序排列
-S 按文件大小来排序
-F –classify 如果名字是目录名则会加上一个‘/’字符

file

打印文件内容的简单描述

less

页面调度器类程序

less filename

命令 行为
PageUp、b 向上翻滚一页
PageDown、space 向下翻滚一页
UpArrow 向上一行
DownArrow 向下一行
q 退出
h 显示帮助屏幕
G 移动到最后一行
g 移动到第一行
/charates 向前查找指定的字符串
n 向前查找下一个出现的字符串(之前指定的)

符号链接

PART4 操作文件与目录

  • cp
  • mv
  • mkdir
  • rm
  • ln

4.1 通配符

通配符 描述
匹配一个字符
* 匹配多个字符(0个或者多个)
[characters] 匹配任意一个属于字符集中的字符
[!characters] 匹配任意一个不属于字符集中的字符
[[:class:]] 匹配任意一个属于字符类中的字符
4.1.1 字符类
字符类 描述
[:alnum:] 字母或数字
[:alpha:] 字母
[:digit:] 数字
[:lower:] 小写
[:upper:] 大写

ls命令为例

  • ls *所有文件
  • ls g*以g开头的所有文件
  • ls g???以g开头后面紧跟三个字符的文件
  • ls [abc]*以a或b或c开头的文件
  • ls abs[0-9][0-9][0-9]以abc开头后面紧跟三个数字的文件
  • [[:alpha:]]*以字母开头的所有文件
  • [![digit]]*不是以数字开头的所有文件
  • *[[:lower:]123]以小写字母或1或2或3结尾的文件

4.2 复制cp

cp file dir将文件复制到dir中

  • -a复制其所有权和权限
  • -i重写已存在文件前,提示用户确认
  • -u仅复制目标目录中不存在的文件
  • -r递归复制目录以及目录中的内容,目录复制时使用
  • -v显示过程

4.3 移动mv

  • -i重写已存在文件前,提示用户确认
  • -u仅移动目标目录中不存在的文件
  • -v显示过程

4.4 删除rm

  • -i删除已存在文件前,提示用户确认
  • -r递归删除
  • -v显示过程
  • -f忽视不存在的文件,覆盖-i

4.5 创建连接ln

  • ln file link创建硬链接
  • ln -s file link创建软连接

PART5 使用命令

  • which显示一个可执行程序的位置
  • help显示shell内建命令的帮助文档
  • --help显示用法信息
  • man显示程序手册页

5.1 创建命令别名alias

  • 使用方式alias name='string'
  1. 尝试名字是否被占用type name
  2. 创建别名alias foo='cd /etc;ls;cat passwd'
  3. 删除别名unalias foo

PART6 重定向

  • cat
  • sort

6.1 输出重定向

6.1.1 标准输出重定向 >
  • ls -l /usr > ls_output.txt
  • > ls_output.txt删除其中的内容,因为每次重定向都是从头写入
  • ls -l /usr >> ls_output.txt每次重定向,续写
6.1.2 标准错误重定向 2>

标准输入、输出和错误, shell 内部分别将其称为文件描述符 0、 1 和 2

  • ls -l /bin/123 2> ls_output.txt

文件描述符 “2”,紧挨着放在重定向操作符之前,来执行重定向标准错误到文件 ls-error.txt任务

6.1.3 重定向标准输出和错误 &>
  • ls -l /usr/bin > ls_output.txt 2>&1

或者

  • ls -l /usr/bin &> ls_output.txt

两个重定向。首先重定向标准输出到文件 ls-output.txt,然后重定向文件描述符 2(标准错误)到文件描述符 1(标准输出)使用表示法 2>&1。 顺序不能错

6.1.4 处理不需要的输出 /dev/null
  • ls -l /usr/bin 2> /dev/null

系统通过重定向输出结果到一个叫做 “/dev/null” 的特殊文件,为我们提供了解决问题的方法。这个文件是系统设备,叫做位存储桶,它可以接受输入,并且对输入不做任何处理。

6.2 标准输入重定向

6.2.1 cat
  • cat file显示文本内容,一般用于显示简短文本
  • cat movie.jpeg.0* >movie.jpeg,将分散的多个文本连结起来(一般都是顺序的文件,所以也会按顺序连结)
  • cat不带参数表示从键盘的输入作为输入源,以Ctrl+d作为结束
  • cat > cat_input.txt,将键盘的输入写入cat_input.txt中,以Ctrl+d作为结束,一般用于创建简短文件
  • cat < test.txt将test.txt作为输入源,与cat test.txt一样的效果
管道线 |
  • 命令从标准输入读取数据并输送到标准输出的能力被一个称为管道线的 shell 特性所利用
  • 使用管道操作符 “|”(竖杠),一个命令的标准输出可以通过管道送至另一个命令的标准输入
  • ls -l /usr/lib | less,将ls的输入作为less的输入进行展示
过滤器
  • ls /bin /usr/bin | sort | less,将ls的输出作为sort的输入,进行排序后的输入作为less的输入进行展示
uniq忽略重复行
  • uniq 从标准输入或单个文件名参数接受数据有序列表,默认情况下,从数据列表中删除任何重复行

  • uniq 命令经常和 sort 命令结合在一起使用

  • ls /bin /usr/bin | sort | uniq | less,从 sort 命令的输出结果中,来删除任何重复行

  • 如果我们想看到重复的数据列表,让 uniq 命令带上 “-d” 选项

    ls /bin /usr/bin | sort | uniq -d| less

wc打印行数/字数/字节数(wc->word_count)
  • wc text.txt打印的结果分别是:行数-单词数-字节数
  • wc text.txt -l只打印行数
grep 打印匹配行
  • grep一个文本查找工具; awk,一个文本分析工具; sed,一个文本处理工具
  • 详见
head/tail打印文件头/尾部分内容
  • 默认各打印10行,可以通过-n num指定打印行数
  • tail通过加入-f可以查看实时文件,当文件更新时自动更新显示
tee将中间输出的内容保存
  • tee 程序从标准输入读入数据,并且同时复制数据到标准输出(允许数据继续随着管道线流动)和一个或多个文件。当在某个中间处理阶段来捕捉一管道线的内容时,这很有帮助
  • ls /usr/bin | tee ouput.txt | grep zip,将ls的输出先进行保存后再进行grep过滤处理(用于调试,将中间结果保存)

PART7——shell解析字符

7.1 字符/路径展开

  • echo hello打印hello

  • echo *shell处理的时候会将*展开后的内容打印处理

  • echo +通配符展示指定文件

7.2 ~展开

  • 展开当前用户目录
  • ~+用户名展开制定用户目录

7.3 {}花括号展开

  • 花括号展开模式可能包含一个开头部分叫做报头,一个结尾部分叫做附言。

  • 花括号表达式本身可能包含一个由逗号分开的字符串列表,或者一个整数区间,或者单个的字符的区间

  • echo front_{1,2,3}_back

    front_1_back front_2_back front_3_back

  • echo front_{1..5}_back

    front_1_back front_2_back front_3_back front_4_back front_5_back

  • 批量创建文件夹mkdir {2020..2023}-0{0..9} {2020..2023}-{10..12}

    2020-01  2020-07  2021-01  2021-07  2022-01  2022-07  2023-01  2023-07
    2020-02  2020-08  2021-02  2021-08  2022-02  2022-08  2023-02  2023-08
    2020-03  2020-09  2021-03  2021-09  2022-03  2022-09  2023-03  2023-09
    2020-04  2020-10  2021-04  2021-10  2022-04  2022-10  2023-04  2023-10
    2020-05  2020-11  2021-05  2021-11  2022-05  2022-11  2023-05  2023-11
    2020-06  2020-12  2021-06  2021-12  2022-06  2022-12  2023-06  2023-12
    

7.4 参数展开

  • echo $USER用户名展开

  • pinrtenv查看可展开的变量

  • 将命令作为参数展开

    echo $(ls -l /usr/bin)

  • 查看过滤后的文件的属性

    file $(ls /usr/bin/* | grep zip)

7.5 控制展开

7.5.1 双引号
  • 如果你把文本放在双引号中,shell 使用的特殊字符,都失去它们的特殊含义,被当作普通字符来看待。有几个例外:$,\ (反斜杠),和 ‘(倒引号)

  • 单词分割、路径名展开、波浪线展开和花括号展开都将失效

    • echo this is a test

      this is a test

    • echo "this is a test"

      this is a test

  • 然而参数展开、算术展开和命令替换仍然执行

    • echo "$USER $((2+2))"

      lux 4

7.5.2 单引号
  • 禁止所有的展开

  • echo text ~/*.txt {a,b} $(echo foo) $((2+2)) $USER

    text /home/lux/test.txt a b foo 4 lux

  • echo "text ~/*.txt {a,b} $(echo foo) $((2+2)) $USER"

    text ~/*.txt {a,b} foo 4 lux

  • echo 'text ~/*.txt {a,b} $(echo foo) $((2+2)) $USER'

    text ~/*.txt {a,b} $(echo foo) $((2+2)) $USER

  • \转译字符,可以消除特殊字符的含义,但是在单引号中转译字符也没用

PART8——键盘使用技巧

  • clear清空屏幕
  • history历史命令

8.1 命令窗口快捷键

8.1.1 移动光标
快捷键 描述
Ctrl+a 移动光标到行首
Ctrl+e 移动光标到行尾
Alt+f 向前移动一个字
Alt+b 向后移动一个字
8.1.2 剪切/粘贴文本
快捷键 描述
Ctrl+k 剪切光标到行尾
Ctrl+u 剪切光标到行首
Ctrl+y 粘贴到光标处

8.2 历史命令

  • history查找历史命令

  • history | grep /usr/bin查找历史命令中与/esr/bin相关的命令

    2051  file $(ls /usr/bin* | grep zip)
     2052  ls /usr/bin*
     2053  file $(ls /usr/bin* | grep x)
     2054  file $(ls /usr/bin* | grep zip)
     2069  history | gerp /usr/bin
     2070  history | grep /usr/bin
     2071  ls /usr/bin*
     2072  history | grep /usr/bin
    
  • ! 2052即可执行对应的命令

PART9——权限

  • id显示用户身份号
  • chmod更改文件模式
  • umask设置默认的文件权限
  • su以另一个身份来运行shell
  • sudo以另一个用户的身份来执行命令
  • chown更改文件所有者
  • chgrp更改文件组所有权

9.1 读取/写入/执行权限

  • ls -l test.txt

    -rw-rw-r-- 1 lux lux 6 2月 20 10:55 test.txt

  • 前10个字符解析

    第一个:

    符号 意义
    - 普通文件
    d 一个目录
    l 一个符号链接
    c 一个字符设备文件
    b 一个块设备文件

    剩余9个(文件模式):

    代表着文件所有者、文件组所有者和其他人的读、写和执行权限

    可以用rwx来表示,刚好三位可以用八进制表示:

    7->rwx 1->x 2->w 4->r

    所以之前用的chmod 777 test.txt就是将所有者、文件组所有者和其他人组的权限都设置为可读写执行

    u代表文件所有者

    g代表文件所属组

    o代表其他所有者

    chmod u+x test.txt 给文件所有者添加可执行权限

    chmod u-x test.txt 给文件所有者删除可执行权限

    以此类推

9.2 umask设置默认权限

  • umask 022
  • 掩码中若出现一个数字 1,则删除文件模式中和这个 1 在相同位置的属性

9.3 su/sudo

9.4 chown/chgrp

9.5 更改用户密码

  • passwd [user]修改密码

PART10——进程

  • ps
  • top
  • jobs
  • bg
  • fg
  • kill
  • killall
  • shutdown

10.1 查看进程

  • ps

  • ps x

    TTY一栏出现?表示没有控制终端

    STAT表示当前进程的状态

    状态 含义
    R 运行中
    S 正在睡眠,进程没有运行,而是正在等待一个事件
    D 不可中断睡眠,正在等待I/O
    T 已停止
    Z 僵尸进程
    < 一个高优先级进程
    N 低优先级进程
  • ps aux

    标题 含义
    USER 进程的所有者
    %CPU CPU 使用率
    %MEM 内存使用率
    VSZ 虚拟内存大小
    RSS 占用的物理内存大小,千字节为单位
    START 进程启动的时间

10.2 动态查看进程top

  • top - 15:45:23 up 29 min,  1 user,  load average: 0.16, 0.36, 0.57
    任务: 309 total,   1 running, 251 sleeping,   0 stopped,   0 zombie
    %Cpu(s):  0.6 us,  0.2 sy,  0.0 ni, 99.2 id,  0.1 wa,  0.0 hi,  0.0 si,  0.0 st
    KiB Mem : 12162404 total,  7581380 free,  1541436 used,  3039588 buff/cache
    KiB Swap:  2097148 total,  2097148 free,        0 used.  9914304 avail Mem
    
    • load average

      第一个是最后 60 秒的平均值,下一个是前 5 分钟的平均值,最
      后一个是前 15 分钟的平均值。若平均值低于 1.0,则指示计算机工作不忙碌。

    • %Cpu(s)

      • 0.7% 的 CPU 被用于用户进程。这意味着进程在内核
        之外。
      • 1.0% 的 CPU 时间被用于系统(内核)进程。
      • 0.0% 的 CPU 时间被用于”nice”(低优先级)进程。
      • 98.3% 的 CPU 时间是空闲的
      • 0.0% 的 CPU 时间来等待 I/O

10.3 控制一个进程

  • xlogo程序为例

  • 运行xlogo,终端等待进程终止,使用Ctrl+c终止程序

  • 将进程放置后台运行,运行xlogo &

    [1] 4470

    任务号:1 PID:4470

    通过ps可以看到后台运行的进程

  • 通过jobs可以看到后台的任务的运行情况

    [1]+ 运行中 xlogo &

  • 将进程返回至前台,运行fg %1

    百分号+任务号

  • 停止一个进程Ctrl+z

    xlogo
    ^Z
    [1]+  已停止               xlogo
    

10.3 给进程发送信号kill

  • kill [-signal] PID

    编号 名字 意义
    1 HUP 挂起
    3 INT 终端,终止一个程序
    9 KILL 杀死
    15 TERM 终止
    18 CONT 继续,在一个停止信号后,回复进程运行
    19 STOP 停止,不是终止

10.4 给多个进程发送信号killall

  • xlogo &

    [1] 4682

  • xlogo &

    [2] 4684

  • killall xlogo

  • jobs

    [1]- 已终止 xlogo [2]+ 已终止 xlogo

10.5 更多进程查看指令

  • pstree树形结构进程列表,展示了进程间的父子进程关系
  • vmstat输出一个系统资源使用快照,包括内存,交换分区和磁盘 I/O。

PART11——shell环境

  • printenv
  • set
  • export
  • alias

12.1 检查环境变量

  • printenv查看环境变量
  • printenv 变量名
  • set当使用没有带选项和参数的 set 命令时,shell 变量,环境变量,和定义的 shell 函数都会被显示
  • echo $变量名
  • alias查看别名

12.2 一些有趣的环境变量

变量 内容
SHELL shell程序的名字
LANG 字符集以及语言编码方式
PATH 由冒号分开的目录列表,当你输入可执行程序名后,会搜索这个目录列表
PS1 这个定义了你的 shell 提示符的内容
TERM 终端类型名。类 Unix 的系统支持许多终端协议;这个变量设置你的终端仿真器所用的协议。
PWD 当前工作目录

12.3 建立shell环境

当我们登录系统后,bash 程序启动,并且会读取一系列称为启动文件的配置脚本,这些文件定义了默认的可供所有用户共享的 shell 环境。

12.3.1 登陆shell会话的启动文件
文件 内容
/etc/profile 应用于所有用户的全局配置脚本。
~/.bash_profile 用户个人的启动文件。可以用来扩展或重写全局配置脚本中的设置
~/.bash_login 如果文件 ̃/.bash_profile 没有找到,bash 会尝试读取这个脚本
~/.profile 如果文件 ~/.bash_profile 或文件 ~/.bash_login 都没有找到,bash 会试图读取这个文件。
12.3.2 非登陆shell会话的启动文件
文件 内容
/etc/bash.bashrc 应用于所有用户的全局配置文件
~/.bashrc 用户个人的启动文件。可以用来扩展或重写全局配置脚本中的设置

在普通用户看来,文件 ∼/.bashrc 可能是最重要的启动文件,因为它几乎总是被读取。非登录 shell 默认会读取它,并且大多数登录 shell 的启动文件会以能读取∼/.bashrc 文件的方式来书写。

12.4 修改shell环境

  • 添加目录到你的 PATH 变量或者是定义额外的环境变量,要把这些更改放置到.bash_profile 文件中(或者其替代文件中,根据不同的发行版如,Ubuntu 使用.profile文件)
  • 对于其它的更改,要放到.bashrc 文件中
  • 修改完成之后执行source .bashrc使其生效

PART13——订制shell提示符

PART14——软件包管理

14.1 从资源库安装一個软件包

从一个资源库中下载一个软件包,并经过完全依赖解析来安装它

风格 命令
Debian apt-get update;apt-get install package_name
RedHat yum install package_name
14.2 通过软件包安装软件

如果从某处而不是从资源库中下载了一个软件包文件,可以使用底层工具来直接(没有经过依赖解析)安装它

风格 命令
Debian dpkg -i package_name
RedHat rpm -i package_name

14.3卸载软件

风格 命令
Debian apt-get remove package_name
RedHat yum erase package_name

14.4 资源库更新

风格 命令
Debian apt-get update;apt-get upgrade
RedHat yum update

14.5 软件包更新

风格 命令
Debian dpkg -i package_file
RedHat rpm -U package_file

14.6列出安装的软件包

风格 命令
Debian dpkg --list
RedHat rpm -qa

14.7 是否安装软件包

风格 命令
Debian dpkg -state package_name
RedHat rpm -q package_name

14.8 显示安装包信息

风格 命令
Debian apt-cache show package_name
RedHat yum info package_name

PART15——存储媒介

  • mount
  • umount
  • fsck
  • fdisk
  • mkfs
  • fdformat
  • dd
  • md5sum

15.1 挂载/卸载文件

  • mount /dev/sdc1 /mnt/sdcard

  • umount /mnt/sdcard

  • 插入可移动设备之前可以通过系统日志查看可移动设备的挂载过程,Ununtu系统的系统日志文件/var/log/messages文件不存在可以通过以下操作打开系统日志

    1. sudo vim /etc/rsyslog.d/50-default.conf

    2. 取消这部分的注释

      *.=info;*.=notice;*.=warn;\
              auth,authpriv.none;\
              cron,daemon.none;\
              mail,news.none          -/var/log/messages
      
    3. 重启服务器systemctl restart rsyslog.service

    4. 通过sudo tail -f /var/log/messages即可实时查看系统日志

15.2 操作挂载设备

15.2.1 操作分区fdisk
  • fdisk可以在设备上编辑,删除,和创建分区
  • ./dev/sdb为例,操作之前必须卸载它sudo umount /dev/sdb
  • 然后调用fdisk,sudo fdisk /dev/sdb
15.2.2 创建新的文件系统mkfs
  • -t用于指定创建的文件系统类型sudo mkfs -t ext3 /dev/sdb1

15.3 设备数据移出/入 dd

  • dd if=input_file of=output_file [bs=block_size [count=blocks]]

PART16——网络系统

  • ping
  • traceroute打印一台网络主机的路由数据包
  • netstat打印网络连接/路由表/接口统计数据等
  • ftp
  • wget
  • ssh

PART17——查找文件

  • locate通过名字查找文件
  • find在一個目录层次结构中搜索文件
  • xargs从标准输入生成和执行命令行
  • touch更改文件是时间
  • stat

17.1 查找文件find

locate 程序只能依据文件名来查找文件,而 find 程序能基于各种各样的属性搜索一个给定目录(以及它的子目录),来查找文件。

17.1.1 找文件类型
  • find $PWD -type f查找当前目录下的文件

    文件类型 描述
    b 块设备文件
    c 字符设备文件
    d 目录
    f 普通文件
    l 符号链接
17.1.2 查找限制条件
  • 查找当前目录下文件大小大于1M,文件名以.jpeg结尾的普通文件

    find $PWD -type f -name "*.jpeg -size +1M"

    • +大于 -小于
    限制条件 描述
    -empty 匹配为空文件或目录
    -iname 同-name,不区分大小写
    -inum 匹配 inode 号是 n 的文件。这对于找到某个特殊 inode 的所有硬链接很有帮助
    -size 匹配大小的文件
    -type 匹配文件类型的文件
    -depth 指示 find 程序先处理目录中的文件,再处理目录自身
    -maxdepth 当执行测试条件和行为的时候,设置 find 程序陷入目录树的最大级别数
    -mindepth 在应用测试条件和行为之前,设置 find 程序陷入目录数的最小级别数。
17.1.3 限制条件逻辑关系符号
  • find 命令提供了一种方法来结合测试条件,通过使用逻辑操作符来创建更复杂的逻辑关系

    逻辑符号 描述
    -and/-a
    -or/-o
    -not/(!)
    () 把测试条件和操作符组合起来形成更大的表达式。这用来控制逻辑计算的优先级。默认情况下,find 命令按照从左到右的顺序计算
17.1.4 预定义操作
  • 执行 find 命令得到结果列表很有用处,但是我们真正想要做的事情是操
    作列表中的某些条目

    操作 描述
    -delete 找到之后删除
    -ls 找到之后ls出来
    -print 找到之后打印到标准输出
    -quit 一旦找到匹配则退出
17.1.5 自定义操作
  • 17.1.4指定了几个固定操作,还可以通过-exec自定义操作

  • -exec command {} ;

    • command 就是指一个命令的名字

    • {}是当前路径名的符号表示

    • 分号是必要的分隔符表明命令的结束

    find $PWD -type f -exec ls -l '{}' ';'

    • 因为花括号和分号对于 shell 有特殊含义,所以它们必须被引起来或被转义
  • 通过使用 -ok 行为来代替 -exec,在执行每个指定的命令之前,会提示用户,相当于rm命令加个-i的情况

    find $PWD -type f -ok ls -l '{}' ';'

17.1.6 xargs
  • find $PWD -type f -print | xargs ls -l

    find 命令的输出被管道到 xargs 命令,之后,xargs 会为 ls 命令构建参数列表,然后执行 ls 命令

PART18——归档和备份

  • gzip
  • bzip2
  • tar
  • zip
  • rsync

18.1 gzip

  • 文件以.gz结尾
选项 描述
-c 把输出写入到标准输出,并且保留原始文件
-d 解压缩
-f 强制压缩
-r 递归地压缩目录中的文件
-t 测试压缩文件的完整性
-v 显示压缩过程中的信息

18.2 bzip2

  • 文件以.bz2结尾
  • 选项同gzip

18.3 tar

模式 描述
c 为文件和/或目录列表创建归档文件
x 抽取归档文件
r 追加具体的路径到归档文件的末尾
t 列出归档文件的内容

PART19——正则表达式

PART20——文本处理

  • cat
  • sort
  • uniq
  • cut
  • paste
  • join
  • comm
  • diff
  • patch
  • tr
  • sed
  • aspell

…未完待续

你可能感兴趣的:(Linux学习过程笔记,linux,服务器,运维)