其他的文本处理命令:
wc命令
cut命令
在文件的每一行中提取片断
注意:能够被cut命令修剪的文本文件或数据内容,一般是具有某种特定格式或结构的文本文件或数据内容;如:/etc/passwd
cut [OPTION]... [FILE]...
常用选项
-d:指定在实施修剪操作时所使用的字段分隔符号,默认是TAB(空白字符);
-f:根据我们指定的字段分隔符号来指定要保留的字段编号的列表;
LIST称为字段列表,地址定界,其书写方法:
1.NUM:选择被指定的单个数字所表示的字段,该字段将被保留;
2.NUM1,NUM2,NUM3,...:离散的多个被指定的字段的数字列表;所有数值所代表的字段均被保留;
3.NUM1-NUM2:连续的多个被指定的字段的数字的列表;所有数值所代表的字段均被保留;
NUM1-:从NUM1开始到结束的所有字段
-NUM2:从行首开始直到NUM2结束;
--output-delimiter:指定输出数据时的字段分隔符号;
awk命令
pattern scanning and processing language
常用选项:
-F:指定字段分隔符,默认是空白字符;
对于awk,根据字段分隔符切分出来的各字段,分别使用$1,$2...$NF来进行标识;$1,$2...$NF是awk的内建变量;
格式:awk|gawk [options]...‘/PATTERN/{print $1,$2}‘
sort命令
sort - 对指定文件中的行,按照ASCII编码表中的字符顺序来排序输出;
sort [OPTION]... [FILE]..
常用选项:
-n:根据数值大小进行排序
-r:倒叙显示排序结果
-R:随机排序;只是此次随机排序算法非常简陋,不适用复杂环境;
-u:重复出现的行,只出现一次;去重的作用;(连续且相同的行称为重复行)
-t:指定字段分隔符;
-k:指定根据哪个关键字字段进行排序,一般和-t同时使用;
uniq命令
删除排序文件中的重复行
注意:uniq命令本身不具备排序的功能;
格式:uniq [OPTION]... [INPUT [OUTPUT]]
常用选项:
-c:对于重复的行计算重复次数;
-d:只显示重复的行,且每个重复行组只显示一行;
-u:只显示不重复的行;
diff命令
逐行比较文件内容
格式:diff [选项] 源文件 目标文件
制作补丁(patch)文件:
# diff file1 file2 > patch_file
注意:patch_file中记录的是file2的内容和file1文件相比有哪些不同内容;
使用patch_file时应向file1打补丁;
patch命令
apply changes to files
格式:patch [-blNR][ -c| -e| -n][-d dir][-D define][-i patchfile]
[-o outfile][-p num][-r rejectfile][file]
-i patchfile:用于指明patch文件的路径;
例子:
12 314 56 89
191 492 9 80
76 11 87 66
1024 99 721 384
从上述数字中找出最大值和最小值;
最大值:
~]# cat number.txt | tr ‘ ‘ ‘\n‘ | sort -n | tail -1
最小值:
~]# cat number.txt | tr ‘ ‘ ‘\n‘ | sort -n | head -1
条件测试命令:
test命令 == [命令,bash的内建命令;
格式: test expression 或 [ expression ]
[[:bash的关键字,一般仅用于某些特定结构或者格式之中;
注意:此类条件测试命令一般没有执行结果,仅有执行状态返回值;如果返回值为0,说明执行成功,如果执行状态返回值为1,则表示执行错误;
条件测试命令共有三类条件测试表达式:
1.数值测试:双目操作;
测试操作符:
-eq:测试两个数值是否相等;相等为真,不等为假;
-ne:测试两个数值是否不等;不等为真,相等为假;
-lt:小于,测试左边的数值是否小于右边的数值;小于为真,不小于为假;
-gt:大于,测试左边的数值是否大于右边的数值;大于为真,不大于为假;
-le:小于等于,测试左边的数值是否小于等于右边数值;符合为真,不符合为假;
-ge:大于等于,测试左边的数值是否大于等于右边数值;符合为真,不符合为假
注意:bash仅支持整数,不支持浮点数;
2.字符串测试:
双目测试:
==|=:测试两个字符串是否为相同字符串;相同为真,不同为假;
!=:测试两个字符串是否为不同字符串;不同为真,相同为假;
>:测试左边的字符串所对应的ASCII编码是否比右边的字符串对应的ASCII编码大;符合为真,不符合为假;
<:测试左边的字符串所对应的ASCII编码是否比右边的字符串对应的ASCII编码小;符合为真,不符合为假;
STRING =~ PATTERN:测试左侧的字符串能否被右边的PATTERN所匹配;可以为真,不能为假;
注意:>,<,=~这三类测试操作符只能用在[[ expression ]]测试语句中;
单目测试:
-z ‘STRING‘:测试STRING是否为空串;空为真,不空为假;
-n ‘STRING‘:测试STRING是否为非空串;不空为真,空为假;
注意:1.通常情况下,字符串是需要用引号引用的,单引号或双引号都可以;只有在特定的情况下,只能选择单引号或双引号;
2.[]和[[]]在某些情况下,意义不完全相同,需要区分对待;
3.如果使用[]或[[]]进行条件判断,在表达式的两端都要留有空白字符,以区分命令和参数之间的关系;
4.所有的双目测试操作符和参数之间也要留有空白字符;
文件测试:
单目测试:
-a|-e FILE:测试文件是否存在,存在为真,不存在为假;
-b FILE:测试文件是否存在且为块设备文件;存在且为块设备为真,否则为假;
-c FILE:测试文件是否存在且是否为字符设备;符合为真,不符合为假;
-d FILE:测试文件是否存在且为目录文件;符合为真,不符合为假;
-f FILE:测试文件是否存在且为普通文件;符合为真,不符合为假;
-h|-L FILE:测试文件是否存在且为符号连接文件;符合为真,不符合为假;
-s FILE:测试文件是否存在且为是否不是空文件;存在且不是空文件为真,否则为假;
-S FILE:测试文件是否存在且为套接字文件;符合为真,不符合为假;
-t FD:测试文件描述符是否在终端上被打开;被打开为真,否则为假;
-r FILE:测试文件是否存在且当前用户是否被授予读取权限;存在且授权为真,否则为假;
-w FILE:测试文件是否存在且当前用户是否被授予写权限;存在且授权为真,否则为假;
-x FILE:测试文件是否存在且当前用户是否被授予执行权限;存在且授权为真,否则为假;
文件特殊权限标识测试:
-u FILE:测试文件是否存在且设置了SUID;存在且授权为真,否则为假;
-g FILE:测试文件是否存在且设置了GUID,存在且授权为真,否则为假;
-k FILE:测试文件是否存在且设置了STICKY,存在且授权为真,否则为假;
文件的所有权测试:
-O FILE:测试文件是否存在且属主为当前有效用户;存在且属主为当前有效用户为真,否则为假;
-G FILE:测试文件是否存在且属组是否为当前有效用户的所在组;存在且属组为当前有效用户的所在组为真,否则为假;
双目测试:
FILE1 -ef FILE2:测试两个文件是否拥有相同的Inode编号;即:两个文件是否互为硬连接;
测试语句中添加逻辑运算符号:
1.利用bash的逻辑运算符号
[ expression1 ] && [ expression2 ]
[ expression1 ] || [ expression2 ]
![ expression1 ]
2.利用条件测试本身的逻辑运算符号
[ expression1 -a expression2 ]
[ expression1 -o expression2 ]
[ !expression1 ]
命令的执行结果:
1.命令的正常输出结果
2.命令的执行状态返回值:
0-255
0:表示命令成功执行或条件判断为真;
1-255:表示命令执行失败或条件判断为假;
1,2,127:系统默认保留的;
3-126,128-255:用户自定义的状态返回值;
exit命令
exit the shell
格式:exit [n]
退出shell时可以使用n作为状态返回值;如果没有指定n,则默认的状态返回值为最后一条命令的状态返回值;
注意:当shell脚本运行时,一旦遇到exit命令将立即结束运行此脚本的shell进程;同时此脚本的运行也会停止;其后续的所有命令都不会再被解释执行;因此,包含了exit命令的脚本,不要使用source命令来执行;
bash的颜色显示规则:
调用了ASCII编码对于颜色的设置方案:
Ctrl键:\033
[:控制字符和颜色代码之间的分隔符;
所有的颜色代码都应该是用m结尾;
颜色代码:
0:关闭颜色显示属性,恢复为黑白色;
1:加粗显示文本字符;
4:为文本字符添加下划线标识;
5:使文本字符闪烁;
7:将文本字符的背景颜色和前景颜色交换;
8.将文本字符的背景颜色设置为与前景色相同;
30-39:设置文本字符的前景色,38,39为保留,暂时未被使用;
40-49:设置文本字符的背景色,48,49为保留,暂时未被使用;
注意:此类控制字符和颜色代码必须放置在echo -e 模式中显示才有效;
程序的组成部分:
一个完整的应用程序,一般包括四类文件:
二进制文件:
头文件和库文件:
帮助文件:
配置文件:
bash--CLI中的一种:
bash同样属于一种完整的应用程序,上述四类文件,bash都有;
二进制文件:/bin/bash
头文件和库文件:/usr/include /lib64/*.so
帮助文件:/usr/share/man/man1/bash.1.gz
配置文件:三类
1.profile:为交互式登陆的shell进程实现功能初始化的配置文件;
2.bashrc:为非交互式登陆的shell进程实现功能启动配置的配置文件;
3.logout:为交互式登陆的shell进程提供终极及清理类功能的配置文件;
bash的类型:
1.交互式登陆的bash
1)直接通过某个终端输入账户信息和密码之后打开的bash进程;
2)su - 或 -l USERNAME 执行切换登录打开的bash进程;
配置文件的加载顺序:
/etc/profile --> /etc/profile.d/*.sh --> ~/.bash_profile --> ~/.bashrc --> /etc/bashrc
2.非交互式登陆的bash
1)在图形界面下,通过菜单项或右键菜单打开的终端所启动的bash进程;
2)使用su USERNAME 执行切换登陆所打开的bash进程;
配置文件的加载顺序:
~/.bashrc --> /etc/bashrc --> /etc/profile.d/*.sh
bash配置文件:
profile类:
1.全局配合文件:/etc/profile,/etc/profile.d/*.sh
注意:在 redhat 或centos 系列的发行版操作系统中,通常会存在这样情况:如果一个配置文件的内容很多,格式很复杂,将会尝试将此配置文件切割拆分为多个片段配置文件,往往把最核心和主要的配置留在主配置文件中,将一些附属的或者扩展的配置内容分散存放到各个片段配置文件中;而被切分出来的片段配置文件一般会统一保存在“程序名称.d”命名格式的目录中;而我们约定在这类目录中保存的片段配置文件的后缀名称会是统一的字符串;
2.个人配置文件
~/.bash_profile
profile类配置文件的作用:
1.用于定义用户的环境变量:
2.用于运行脚本或者执行某些特殊的命令;
bashrc类:
全局配置文件:/etc/bashrc
个人配置文件:~/.bashrc
bashrc类配置文件作用:
1.用于定义本地变量
2.用于定义命令别名
3.用于定义umask
注意:只有root用户能够修改全局类的bash配置文件,普通用户只能修改其家目录中属于个人的配置文件;
为什么要为bash使用配置文件?
所有利用bash命令行完成的命令操作,只要没有涉及到文件修改的,一般都只是针对当前的shell生效,一旦shell进程结束,则此前所有的操作将失效;
配置文件的作用:
1.能够使用户赖以生存的配置信息长期有效
2.能够让用户保存此前的配置内容;
让配置文件中新进修改的内容生效:
1.注销重新登陆,打开新的shell进程
2.source命令
3.exec命令
logout类:
个人配置文件:
~/bash_logout
作用:在关闭shell进程之前清除某些用户自定义的配置或者是删除某些临时文件或目录,以及撤销用户此前定义的变量,清理某些可能会引发安全问题的隐患等操作;
bash的变量中存放的字符串的处理方式:
bash变量:
弱变量:
1.无需事先定义即可应用
2.变量没有数据类型的硬性要求,默认是字符型;
1.字符串切片:
${#VAR}:返回字符类型变量的变量值的长度(单位:字节)
${VAR:offset}:返回字符型变量中第“offset”位置之后的内容;不包括第offset个位置的字符;offset取值范围为0-$[{#VAR}-1]
${VAR:offset:NUMBER}:返回字符型变量中从第“offset”个字符后开始长度为number的字符部分;
${VAR: -length}:取字符型变量字符串最右侧的“length”个字符;(在length前要留有空格)
2.基于模式(PATTERN)取字符串
${VAR#*PATTERN}:自左而右,查找VAR变量所储存的字符串中,第一次被PATTERN匹配的字符,删除从字符串开始到第一个PATTERN匹配的字符之间的所有字符;
${VAR##*PATTERN}:自左而右,查找VAR变量所储存的字符串中,所有被PATTERN匹配的字符,删除从字符串开始到最后一个PATTERN匹配的字符之间的所有字符;
${VAR%PATTERN*}:自右向左,查找VAR变量所储存的字符串中,第一次被PATTERN匹配到的字符,删除从字符串结尾到第一个被PATTERN匹配的字符之间的所有字符;
${VAR%%PATTERN*}:自右向左,查找VAR变量所储存的字符串中,所有被PATTERN匹配到的字符,删除从字符串结尾到最后一个被PATTERN匹配的字符之间的所有字符;
3.查找替换
${VAR/PATTERN/SUBSTRING}:自左向右,在VAR变量中,查找能够被PATTERN匹配的内容,将其中第一个匹配到的结果更换成substring;
${VAR//PATTERN/SUBSTRING}:自左向右,在VAR变量中,查找能够被PATTERN匹配的内容,将其中所有匹配到的结果更换成substring;
${VAR/#PATTERN/SUBSTRING}:在VAR变量中查找行首匹配PATTERN的内容,将匹配的结果更换成SUBSTRING;
${VAR/%PATTERN/SUBSTRING}:在VAR变量中查找行尾匹配PATTERN的内容,将匹配的结果更换成SUBSTRING;
4.查找删除
${VAR/PATTERN}:自左向右,在VAR变量中,查找能够被PATTERN匹配的内容,将其中第一个匹配到的结果删除;
${VAR//PATTERN}:自左向右,在VAR变量中,查找能够被PATTERN匹配的内容,将其中所有匹配到的结果删除;
${VAR/#PATTERN}:在VAR变量中查找行首匹配PATTERN的内容,将匹配的结果删除;
${VAR/%PATTERN}:在VAR变量中查找行尾匹配PATTERN的内容,将匹配的结果删除;
5.字符串的大小写转换:
${VAR^^}:将变量当中的所有的小写字母转换成大写字母;
${VAR,,}:将变量当中的所有的大写字母转换成小写字母;
6.变量赋值操作:
${VAR:-value}:如果变量VAR为空值或者变量未被定义,那么直接返回value中的值;否则返回变量VAR的值;
${VAR:+value}:如果变量VAR不为空值或者变量已被定义,那么直接返回value中的值;
${VAR:=value}:如果变量VAR为空值或者变量未被定义,那么直接返回value中的值;并且将value的值赋给变量VAR,否则返回变量VAR的值;
7.变量的间接引用
如果第一个变量的值恰好是第二个变量的变量名,从第一个变量引用第二个变量的值的方法,称为变量的间接引用;
bash提供了这样的间接变量引用的方法:
eval MYVAR=\$$VAR1