快乐的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'
- 尝试名字是否被占用
type name
- 创建别名
alias foo='cd /etc;ls;cat passwd'
- 删除别名
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/bin2070 history | grep /usr/bin2071 ls /usr/bin*2072 history | grep /usr/bin
-
! 2052
即可执行对应的命令
PART9——权限
id
显示用户身份号chmod
更改文件模式umask
设置默认的文件权限su
以另一个身份来运行shellsudo
以另一个用户的身份来执行命令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
- 0.7% 的 CPU 被用于用户进程。这意味着进程在内核
-
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
文件不存在可以通过以下操作打开系统日志-
sudo vim /etc/rsyslog.d/50-default.conf
-
取消这部分的注释
*.=info;*.=notice;*.=warn;\\auth,authpriv.none;\\cron,daemon.none;\\mail,news.none -/var/log/messages
-
重启服务器
systemctl restart rsyslog.service
-
通过
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
…未完待续