1、总结学过的文本处理工具,文件查找工具,文本处理三剑客, 文本格式化命令(printf)的相关命令及选项,示例。
- cat
-E:显示行结束符$
-A:显示所有控制符
-n:对显示的每一行进行编号
-b:非空行编号
-s:压缩连续的空行成一行
- nl
相当于cat -b - tac
逆向显示文本内容 - rev
将同一行的内容逆向显示 - head
可以显示文件或标准输入的前面行
-c # 指定获取前#字节
-n # 指定获取前#行,#如果为负数,表示从文件头取到的倒数第#前
-# 和-n #一样
- tail
查看文件或标准输入的倒数行
-c # 指定获取后#字节
-n # 指定获取后#行,#如果为负数,表示从开头第#行到文件结束
-# 和-n #一样
-f 跟踪显示文件fd新追加的内容,常用于日志监控,相当于--follow=descriptor,当文件删除再新建同名文件,将无法继续跟踪文件
-F 跟踪文件,相当于--follow=name --retry,当文件删除再新建同名文件,将可以继续跟踪文件
- cut
-d:指明分隔符
-f:
#:第#个字段,例如:3
#,#:离散的多个字段,例如:1,3,6
#-#:连续的多个字段,例如1-6
-c:按字符切割
--output-delimiter=string 指定输出分隔符
- paste
合并多个文件同行号的到一行
-d #分隔符:指定分割符,默认用tab
-s:所有行合成一行显示
- wc
wc命令可以用于统计文件的行总数,单词总数,字节总数和字符总数,可以对文件或stdin中的数据统计
-l:只记数行数
-w:只计数单词总数
-c:只计数字节总数
-m:只计数字符总数
-L:显示文件中最长行的长度
- sort
把整理过的文本显示在stdout中,不改变原始文件
-r 执行反方向(右上到下)整理
-R 随机顺序
-n 执行数字大小整理
-h 按照人类可读排序如:2k 1G
-f 选项忽略字符串中的字符大小写
-u 合并重复项,去重
-t c 使用c做字段界定符
-k # 按照使用c为字符分割的#列来整理,能够使用多次
- uniq
从输入中删除前后相接的重复的行
-c 显示每行重复出现的次数
-d 仅显示重复过的行
-u 仅显示不曾重复的行
- diff
diff命令比较两个文件中的区别
-u 输出统一的unified的格式文件,适用于补丁文件
- grep
常见选项
--color=auto 对匹配到的文本着色显示
-m # 匹配#次后停止
-v 显示不被pattern匹配到的行
-i 忽略大小写
-n 显示匹配的行号
-c 统计匹配的行数
-o 仅显示匹配到的字符串
-q 静默模式,不输出任何信息
-A # after,后#行
-B # before,前#行
-C # context,前后各#行
-e 实现多个选项间的逻辑
-w 匹配整个单词
-E 使用ERE,相当于egrep
-f file 根据模式文件处理,如:grep -f t1.txt t2.txt找出两个文件相同的内容
-r 递归处理,但不处理软链接
-R 递归处理,但处理软链接
- sed
常用选项
-n 不输出模式空间到屏幕,即不自动打印
-e 多点编辑
-f file 从指定文件中读取编辑脚本
-r 使用扩展正则表达式
-i.bak 备份文件并原处编辑
script命令格式 '地址命令'
地址格式:
1、不给地址,对全文进行处理
2、单地址:
#:指定的行
$:最后一行
/pattern/:被此模式所能够匹配到的每一行
3、地址范围:
#,# 从#行到第#行,3,6 从第3行到第6行
#,+# 从#行到+#行,3,+4 表示从3行到第7行
/part1/,/part2/
#,/part/
/part/,#
4、步进:~
1~2 奇数行
2~2 偶数行
命令:
p 打印当前模式空间内容,追加到默认输出之后
Ip 忽略大小写输出
d 删除模式空间匹配的行,并立即启用下一轮循环
a [\]text 在指定行后面追加文本,支持使用\n实现多行追加
i [\]text 在行前面插入文本
c [\]text 替换行为单行或多行文本
w file 保存模式匹配的行至指定文件
r file 读取指定文件的文本至模式空间中匹配到的行后
= 为模式空间中的行打印行号
! 模式空间中匹配行取反处理
q 结束或退出sed
查找替换
s/pattern/string/修饰符 查找替换,支持使用其它分隔符,可以是其它形式:s@@@,s###
g 行内全局替换
p 显示替换成功的行
w /PATH/FILE 将替换成功的行保存至文件中
I,i 忽略大小写
2、总结文本处理的grep命令相关的基本正则和扩展正则表达式。
- 基本正则
字符匹配
. #匹配任意单个字符(除了\n)可以是汉字或其他国家文字
[] #匹配指定范围内的任意单个字符,示例:[wang] [0-9] [a-z] [a-zA-Z]
[^] #匹配指定范围外的任意单个字符,示例:[^wang]
[:digit:] #任意数字,相当于0-9
[:lower:] #任意小写字母,表示a-z
[:upper:] #任意大写字母,表示A-Z
[:alpha:] #任意大小写字母
[:alnum:] #任意数字或字母
[:blank:] #水平空白字符
[:space:] #水平或垂直空白字符
[:punct:] #标点符号
[:print:] #可打印字符
[:cntrl:] #控制(非打印)字符
[:graph:] #图形字符
[:xdigit:] #十六进制字符
匹配次数
要用在指定次数的字符后面,用于指定前面的字符要出现的次数
* #匹配前面的字符任意次数,包括0次,尽可能长的匹配
.* #任意长度的任意字符
\? #匹配其前面的字符出现0次或1次,即:可有可无
\+ #匹配其前面的字符出现最少1次,即>=1
\{n\} #匹配前面的字符n次
\{m,n\} #匹配前面的字符至少m次,至多n次
\{,n\} #匹配前面的字符至多n次,<=n
\{n,\} #匹配前面的字符至少n次,>=n
位置锚定
用于定位出现的位置
^ #行首锚定,用于模式的最左侧
$ #行尾锚定,用于模式的最右侧
^PATTERN$ #用于模式匹配整行
^$ #空行
^[[:space:]]*$ #空白行
\<或\b #词首锁定,用于单词模式的左侧
\>或\b #词尾锁定,用于单词模式的右侧
\<PATTERN\> #匹配整个单词
分组
分组:用()将多个字符捆绑在一起,当作一个整体处理
后向引用:分组括号中的模式匹配到的内容会被正则表达式记录在内部的变脸中,这些变量的命名方式为:\1,\2,\3,.....
注意:\0表示正则表达式中匹配所有的字符
\(A\(B\)\)
\1:A\(B\)
\2:B
或者
或者:a\ |b
示例:
a\|b #a或b
C\|cat #C或cat
\(C\|c\)at #Cat或cat
- 扩展正则表达式元字符
字符匹配
. #匹配任意单个字符(除了\n)可以是汉字或其他国家文字
[] #匹配指定范围内的任意单个字符,示例:[wang] [0-9] [a-z] [a-zA-Z]
[^] #匹配指定范围外的任意单个字符,示例:[^wang]
[:digit:] #任意数字,相当于0-9
[:lower:] #任意小写字母,表示a-z
[:upper:] #任意大写字母,表示A-Z
[:alpha:] #任意大小写字母
[:alnum:] #任意数字或字母
[:blank:] #水平空白字符
[:space:] #水平或垂直空白字符
[:punct:] #标点符号
[:print:] #可打印字符
[:cntrl:] #控制(非打印)字符
[:graph:] #图形字符
[:xdigit:] #十六进制字符
次数匹配
* #匹配前面的字符任意次数,包括0次,尽可能长的匹配
.* #任意长度的任意字符
? #匹配其前面的字符出现0次或1次,即:可有可无
+ #匹配其前面的字符出现最少1次,即>=1
{n} #匹配前面的字符n次
{m,n} #匹配前面的字符至少m次,至多n次
{,n} #匹配前面的字符至多n次,<=n
{n,} #匹配前面的字符至少n次,>=n
位置锚定
^ #行首锚定,用于模式的最左侧
$ #行尾锚定,用于模式的最右侧
^PATTERN$ #用于模式匹配整行
^$ #空行
^[[:space:]]*$ #空白行
\<或\b #词首锁定,用于单词模式的左侧
\>或\b #词尾锁定,用于单词模式的右侧
\<PATTERN\> #匹配整个单词
分组其他
() #分组
| #或者
a|b #a或b
C|cat #C或cat
(C|c)at #Cat或cat
3、总结变量命名规则,不同类型变量(环境变量,位置变量,只读变量,局部变量,状态变量)如何使用。
- 命名要求
区分大小写不能使程序中的保留字和内置变量:如:if,for
只能使用数字、字母及下划线,且不能以数字开头,不支持短横线
变量名大写
局部变量小写
函数名小写
大驼峰StudentFirstName,由多个单词组成,且每个单词的首字母是大写,其它小写
小驼峰studentFirstName,由多个单词组成,第一个单词的首字母小写,后续每个单词的首字母是大写,其它小写
下划线:student_name - 环境变量
可以使子进程(包括孙子进程)继承父进程的变量,但是无法让父进程使用子进程的变量一旦子进程修改从父进程继承的变量,将会新的值传递给孙子进程.
export name=VALUE - 位置变量
位置变量:在bash shell中内置的变量,在脚本代码中调用通过命令行传递给脚本的参数
$1,$2, ….. 对应第1个、第2个等参数
$0命令本身,包括路径
$*传递给脚本的所有参数,全部参数合为一个字符串
$@传递给脚本的所有参数,每个参数为独立字符串
$#传递给脚本的参数的个数 - 只读变量
只读变量:只能声明定义,但后续不能修改和删除,即常量
声明只读变量:
readonly name
查看只读变量:
readonly -p - 局部变量
定义在函数内部的变量 - 状态变量
进程执行后,将使用变量$?保存状态码的相关数字,不同的值反应成功或失败,$?取值范例0-255
$?的值为0 #代表成功
$?的值是1到255 #代表失败
在脚本中使用以下命令自定义退出状态码
exit [n]
4、通过shell编程完成,30鸡和兔的头,80鸡和兔的脚,分别有几只鸡,几只兔?
答:rabbit=10 chicken=20
#!/bin/bash
foot=80
head=30
rabbit=$[$[foot-head-head]/2]
chicken=$[head-rabbit]
echo rabbit=$rabbit chicken=$chicken
#!/bin/bash
ch=2
ra=4
head=30
feet=80
for i in {1..29};do
if [ $[$[i*ra]+$[$[head-i]*ch]] -eq $feet ] ;then
echo rabbit=$i chicken=$[head-i]
fi
done
5、结合编程的for循环,条件测试,条件组合,完成批量创建100个用户,
1)for遍历1..100
2)先id判断是否存在
3)用户存在则说明存在,用户不存在则添加用户并说明已添加。
#!/bin/bash
name=user
for i in {1..100};do
id $name$i &> /dev/null
if [ $? -eq 0 ];then
echo "$name$i 已存在"
else
useradd -d /home/$name$i -s /bin/bash $name$i && echo "$name$i 已创建"
fi
done
6、磁盘存储术语总结: head, track, sector, sylinder.
head-磁头 track-磁道 sector-扇区 sylinder-柱面
7、总结MBR,GPT结构。
- MBR: 使用32位表示扇区数,分区不超过2T
0磁道0扇区:512bytes
446bytes: boot loader 启动相关
64bytes:分区表,其中每16bytes标识一个分区
2bytes: 55AA,标识位
MBR分区中一块硬盘最多有4个主分区,也可以3主分区+1扩展(N个逻辑分区)
MBR分区:主和扩展分区对应的1 -- 4,/dev/sda3,逻辑分区从5开始,/dev/sda5 - GPT: 支持128个分区,使用64位,支持8Z(512Byte/block )- 64Z (4096Byte/block)
使用128位UUID(Universally Unique Identifier)表示磁盘和分区GPT分区表自动备份在头和尾两份,并有CRC柠验位
8、总结学过的分区,文件系统管理,SWAP管理相关的命令及选项,示例fdisk,parted,mkfs,tune2fs,xfs_info,fsck,mount,umount,swapon,swapoff
- fidk
fdisk -l [-u] [device ... ] 查看分区
fdisk [device ... ] 管理MBR分区
gdisk [device ... ] 类fdisk 的GPT分区工具
子命令:
p 分区列表
t 更改分区类型
n 创建新分区
d 删除分区
V 校验分区
u 转换单位
w 保存并退出
q 不保存并退出
查看内核是否已经识别新的分区
cat /proc/partitions
CentOS 7,8同步分区表:
partprobe - parted
格式:
parted [选项] ... [设备 [命令 [参数] ... ] ... ]
范例:
parted /dev/sdb mklabel gpt|msdos
parted /dev/sdb print
parted /dev/sdb mkpart primary 1 200(默认M)
parted /dev/sdb rm 1
parted -1 列出所有硬盘分区信息 - mkfs
是分区创建文件格式 mkfs .ext4 /dev/sda mkfs .xfs /dev/sda - xfs_info 查看xfs文件信息
mount -a 自动挂载文件系统 mount -r 只读挂载 - umount 卸载挂载点
- swapon 启用swap分区
- swapoff 禁用swap分区