bash 的基础特性:
- history 命令历史
环境变量:
HISTSIZE: 命令历史记录的条数
HISTFILE: ~/.bash_history
HISTFILESIZE: 命令历史文件记录历史的条数
history -d OFFSET
-c: 清空历史记录
-a: 手动谁家当前会话缓冲区的命令历史至历史文件中
调用历史命令:
!#: 重复执行第#条命令
!!: 重复执行上一条命令
!-#: 重复执行倒数第#条命令
!string: 执行最近一次匹配 string 的历史命令
调用上一条命令的最后一个参数:
!$
ESC . 按完 esc 后松开,再按.(点)号
alt + . 不是所有终端都支持这种命令(CentOS支持)
控制命令历史的记录方式:
环境变量:HISTCONTROL
ignoredups: 忽略重复的命令:连续且相同的放味“重复”
ignorespace: 忽略所有以空白开头的命令
ignoreboth: 以上两种
修改环境变量值的方式:export 变量名="值"
变量赋值:把赋值符号后面的数据存储于变量名指向的内存空间(如果在当前 shell 中执行,那么只对当前 shell 有效)
- 命令补全
- 路径补全
目录管理类命令
cd, pwd, ls
mkdir [OPTIONS] /path/to/somewhere
-p
-v: 显示详细信息
-m: mode 创建目录时指定权限,比如 mkdir -pv -m=xwr ./test/a/b/c
rmdir: 删除空目录
rmdir [OPTIONS]...DIRECTORY...
-p
-v: 显示详细信息
tree: 显示目录层级
-d: 只显示目录
-L: level, 指定显示的层级数目
-P: pattern: 只显示由指定 pattern 匹配到的路径
- 命令行展开
~: 展开为用户的主目录
~USRNAME: 展开为指定用户的主目录
{}: 可承载一个以逗号分隔的列表,并将其展开为多个路径
练习1:如何创建 /tmp/x/a
, /tmp/x/b
, /tmp/a/b
, /tmp/c/b
mkdir -p /tmp/x/{a,b}
mkdir -p /tmp/{a,c}/b
练习2:如何创建 x_m
, y_m
, x_n
, y_n
mkdir -p {x,y}_{m,n}
练习3:如何创建 /tmp/bin
, /tmp/sbin
, /tmp/usr
, /tmp/usr/bin
, /tmp/usr/sbin
mkdir -p /tmp/{bin,sbin,usr/{bin,sbin}}
- 命令执行的结果状态
bash 使用特殊变量 `$?` 保存最近一条命令的执行状态结果
0: 成功
1-255:失败
程序执行有两类结果:
程序的返回值
程序的执行状态结果
【文本】文件查看类命令
cat, tac: 连接文件内容后直接 dump 到屏幕上,不能翻屏以及进行交互
more, less, tail, head
more [OPTIONS]... FILE... 如果读取到文件尾部会自动退出交互(如同直接打印到了屏幕上)
-d: 显示翻页及退出提示
less [OPTIONS]... FILE... 读取到文件结尾命令也不会退出(man 查看帮助文件时命令就使用到了 less 命令来进行工作)
head [OPTIONS]... FILE... 默认获取显示文件前 10 行
-c #:指定获取前 # 字节
-n #:指定获取前 # 行
-#
#: 直接跟数字
如下命令效果相同
heal -n 10 /etc/rc.d/rc.local
heal -10 /etc/rc.d/rc.local
heal 10 /etc/rc.d/rc.local
heal /etc/rc.d/rc.local
tail [OPTIONS]... FILE...
-c #:指定获取前 # 字节
-n #:指定获取前 # 行
-#
#: 直接跟数字
-f: 跟踪显示文件新追加的内容
文件的时间戳管理工具
touch
文件:metadata, data
查看文件状态:stat
三个时间戳:
access time: 访问时间,简写为 atime,读取文件内容(cat,tac,less,more,head,tail 等)
modify time: 修改时间,mtime,改变文件内容(数据-data)
change time: 改变时间,ctime,元数据发生改变(metadata)
touch [OPTIONS]... FILE...
-a: only atime
-m: only mtime
-t STAMP:
[[CC]YY]MMDDhhmm[.ss]
比如将文件的访问时间修改为 2019年03月27号10时14分59秒:touch -a -t 201903271014.59
-c: 如果文件不存在,则不创建文件
bash 的基础特性(2)
1. alias:命令别名
通过 alias 命令实现:
(1)alias
显示当前 shell 进程所有可用的命令别名
(2)alias NAME='VALUE'
定义别名 NAME,相当于执行命令 VALUE
注意:在命令行中定义的别名,仅对当前 shell 进程有效,如果要永久有效,要定义在配置文件中
仅对当前用户:~/.bashrc
对所有用户有效:/etc/bashrc
bash 进程重新读取配置文件:
source /path/to/config_file
. /path/to/config_file
撤销别名:unalias name [name...]
-a: 移除所有别名
注意:如果别名同原命令的名称相同,如果想执行原命令,可以使用转移字符 "\COMMAND"
2. glob(globbing)通配符,在最新的 CentOS7 中已经删除了 glob 的相关描述文档,
删除的原因由于 glob 已经整合到了 shell 之中,然后就有了 shell 通配符。
bash 中用于实现文件名“通配”
通配符:*, ?, []
(1)*:任意长度的任意字符
(2)?: 任意单个字符
(3)[]:匹配指定范围内的任意单个字符
[0-9]
[a-z]:不区分字母的大小写
[A-Z]: 大写字母
(4)[^]:配比指定范围外的任意单个字符
[^0-9]
专用字符集合:
[:digit:]: 任意数字,相当于 0-9
[:lower:]: 任意小写字母
[:upper:]: 任意大写字母
[:alpha:]: 任意大小写字母
[:alnum:]: 任意数字或字母
[:space:]: 任意空格
[:punct:]: 任意标点符号,punctuation [ˌpʌŋktʃuˈeɪʃn]
[:xdigit:]: 十六进制数
[:graph:]: 图形
[:print:]: 可打印字符
[:cntrl:]: 控制符
请看下面的练习题
3. bash 的快捷键
ctrl + l:清屏,相当于 clear
ctrl + a:跳转到命令开始处
ctrl + e:跳转到命令结尾处
ctrl + c:取消命令的执行
ctrl + u:删除命令行【行首至光标所在处】的所有内容
ctrl + k:删除【光标所在处至命令行行尾】的所有内容
4. bash 的 I/O 重定向和管道
程序:指令 + 数据
读入数据:Input
输出数据:Output
打开的文件都有一个fd(file descriptor:文件描述符),linux 一切皆文件的概念
系统默认标准输入:keyword,0
系统默认标准输出:monitor,1
标准错误输出(即 bash 解释命令所发生的错误,比如 ls -hello ./ 所输出的错误信息):monitor,2
I/O 重定向:改变标准位置,即不从标准输入读数据,不向标准输出输出数据
输出重定向:COMMAND > NEW_POSITION, COMMAND >> NEW_POSITION
重定向到指定文件中,也可以重定向到设备中(因为设备也是文件,一切皆文件)
>: 覆盖重定向
>>: 输出重定向,新内容追加到目标文件尾部
set -C: 禁止将内容覆盖输出至已有文件中,防止覆盖数据的危险发生
强制覆盖: >|
set +C: 打开上面禁止的内容
2>: 覆盖重定向错误输出数据流
2>>: 追加重定向错误输出数据流
标准输出和错误输出各自重定向至不同位置
COMMAND > /path/to/stdout 2> /path/to/stderr
这样会产生一个问题,错误和正常同时只能有一个位置有数据,另外一个位置的不会产生数据并且还会生成文件
合并标准输出和错误输出为同一个数据流进行重定向
&>: 覆盖重定向
&>>: 追加重定向
COMMAND > /path/to/file.out 2>&1
COMMAND > /path/to/file.out 2>>&1
输入重定向:<
HERE DOCUMENTATION: <<, 此处文档,用于输出文档
cat << EOF
cat > /path/to/somefile << EOF
管道 |
COMMAND1 | COMMAND2 | COMMAND3 | ...
注意:最后一个命令会在当前 shell 进程的子 shell 进程中执行 ? 为什么?????
例子:
1. 将文件修改后作为查看文件命令 `more` 的输入
cat /etc/init.d/network | tr 'a-z' 'A-Z' | more
tee 命令:
tee [OPTION]... [FILE]...
从标准输入(键盘)读取数据流,写入到标准输出设备和文件
例子:
1. 从键盘读入数据流,默认输出到屏幕和文件中
tee /tmp/test.tee
2. 从指定文件读取文件写入到文件中后,将字母转换为大写字母
cat /etc/init.d/network | tee ./tee.out | tr 'a-z' 'A-Z'
练习:
1. 将 `/etc/passwd` 文件中的前5行转换为大写后保存至 `/tmp/passwd.out` 文件中
head -n 5 /etc/passwd | tr 'a-z' 'A-Z' | tee /tmp/passwd.out
2. 将登录至当前系统上的用户信息中的后三位信息转换为大写后保存至 `/tmp/who.out` 文件中
w | tail -n 3 | tr 'a-z' 'A-Z' | tee /tmp/who.out
HERE DOCUMENTATION:此处文档
tr 命令:转换或删除字符(默认从标准输入读取数据流,即键盘),对应位置转换,如下图 a -> A, b -> B, c -> B(位置对应不上时,取 SET2 的最后一位)
tr [OPTION]... SET1 [SET2]
tr -d SET1:删除 SET1 出现的字符
tr
命令的例子:
将【SET1】中的字符转换成【SET2】对应字符
- 将
/etc/fstab
中所有abc
小写字母转换成大写字母
- 将
/etc/fstab
所有字母转换成大写
练习
1. 显示 /var 目录下所有以 l 开头,以一个小写字母结尾中间出现至少一位数字的文件或目录
ls /var/l*[[:digit:]]*[[:lower:]]
ls /var/l*[0-9]*[[:lower:]]
2. 显示 /etc 目录下,以任意一位数字开头,且以非数字结尾的文件或目录
ls /etc/[0-9]*[^0-9]
ls /etc/[[:digit:]]*[^0-9]
3. 显示 /etc 目录下,以非字母开头,后面跟了一个字母以及其它任意长度任意字符的文件或目录
ls /etc/[^[:alpha:]][:alpha:]*
4. 复制 /etc 目录下,所有以 m 开头,以非数字结尾的文件或目录至 /test/4 目录中
cp -r /etc/m*[^0-9] /test/4
5. 复制 /etc 目录下,所有以 .d 结尾的文件或目录至 /test/5 目录中
cp -r /etc/*.d /test/5
cp -r /etc/*\.d /test/5
6. 复制 /etc 目录下,所有以 .conf 结尾,且以 m,n,r,p 开头的文件或目录至 /test/6 目录中
cp -r /etc/[mnrp]*.conf /test/6
cp -r /etc/[mnrp]*\.conf /test/6
文本处理工具: wc
, cut
, sort
, uniq
1. wc [OPTION]... [FILE]...
打印每个文件的行数,单词数(视空格分割的就是一个单词)和字节数
-c, --bytes: 打印字节数
-m, --chars: 打印字符数
-l, --lines: 打印行数
-w, --words: 打印单词数
2. cut OPTION... [FILE]...
将文件的内容切成几列,默认以空白字符作为分隔符
-d, --delimiter=DELIM: 指定分隔符
-f, --fields=LIST: 指定要显示的列,
#:第#个字段
#,#[,#...]:离散的多个字段,例如:1,3,6
#-#:连续的多个字段,例如:1-6
混合使用:1-3,7 显示第1到3列并显示第7列
--output-delimiter=STRING: 使用 STRING 作为输出分隔符
例子:分割 /etc/passwd
文件,显示第1到3列和第7列,并两个空格分割
cut -d : -f 1-3,7 --output-delimiter=' ' /etc/passwd
cut -d: -f1-3,7 --output-delimiter=' ' /etc/passwd
选项间可以不用加空格,以上两种命令都可以
3. sort [OPTION]... [FILE]... 默认字母升序排序
-r: 逆序
-f: 忽略字符大小写
-t, --field-separator=SEP: 字段分隔符
-k, --key=KEYDEF: 以指定字段为标准排序
-n, --numeric-sort: 根据数值进行比较
-u, --unique: 排序后去重
例子:/etc/passwd
按照第三个字段进行排序,并将第三个字段输出
sort -t: -k3 -n /etc/passwd | cut -d: -f3
4. uniq [OPTION]... [INPUT [OUTPUT]]
-c, --count: 显示每行重复出现的次数
-d, --repeated: 仅显示重复过的行
-u, --unique: 仅显示不曾重复过的行
注意:连续且完全相同方为重复
为什么不直接用 sort -u 进行排序, uniq 有 sort 没有的功能,比如上面那些选项
例子:显示 history
命令出现的的次数
history | cut -d' ' -f5 | sort | uniq -c
练习:以冒号分割,取出 /etc/passwd
文件的第6至第10行,并将这些信息按第3个字段的数值大小进行排序,最后仅显示各自的第1个字段
head -n10 /etc/passwd | tail -5 | sort -t: -k3 -n | cut -d: -f1
网友评论