第二周
创建一个文件,添加内容,并且演示课程命令cat,tail,more等等相关文本处理工具的用法,并且总结到博客,添加详细的注释信息
查看文本文件内容
cat
-A 显示所有控制符
-n 显示行号
-b 空行不显示行号
tac
逆向显示文件
查看非文本文件内容
hexdump:查看二进制文件十六进制编码 其实任意文件都可以查看
hexdump -C -n 512 /dev/sda
-C 以可见字符显示 输出规范的十六进制和ASCII码
-n 显示512个字符
分页查看文件内容
### more
-s 压缩连续的空行
空格翻页
回车下一行
也可以!输入命令
less
-e 显示完成后自动退出
-N 显示行号
-S 遇到较长的一行不换行 显示在一行
显示文本前面或后面的行内容
head
-c 指定获取前N字节
-n 指定获取前N行 若N为负数则表示从头取到倒数第N前
使用随机字符串修改密码
cat /dev/urandom | tr - dc '[:alnum:]' |head -c 10| tee pass.txt| passwd --stdin fan
tail
查看倒数的行
-n 获取后N行, 若写成+N表示从第N行开始到文件结束
-f 跟踪显示文件的新追加的内容
tail -fn0 一般用户查看日志 只查看最新发生的日志
按列抽取文本 cut
cut 可以提取文本文件或STDIN数据的指定列
-b 以字节分割
-c 以字符分割
-d 指定分隔符
-f 要显示的列 (-f1或 -f1,2,3 -f 1-3)
--output-delimiterr=STRING 对输出时的结果指定分隔符
取出ip地址

去除df命令中 USE列



取出passwd中 1 2 7 列并以空格为分割符
合并多个文件
paste合并多个文件同行号的行到一行
paster [option] file
-d: 指定分隔符
-s: 合成一行



例:批量修改密码

分析文本统计数据 wc
用于统计文件的行总数,字节总数,字符总数
wc
-l 只统计行数
-w 统计单词数
-c 统计字节总数
-m 统计字符总数

三列分别为 2行数 2单词数 8字节数


由此可以证明一个中文当作一个字符 三个字节 一个英文当作一个字符 一个字节
动态的取出df命令中除第一行以为的其余行
df | tail -n $[$(df|wc -l)-1]
注:echo '7-1'
echo $[7-1]
$ 和``都是用来当作命令替换的
$(())和$[]属于执行计算公式

排序sort
sort
-n 以数字大小排序(默认是按ASCII码进行排序)
-k 指定排序列
-u 去重
-r 倒序
-t 指定列分割符
取出df中使用率并排序
df | tr -s ' '|cut -d ' ' -f5| tr -d %|tail -n 6|sort -nr

去重
uniq
-c 显示每行出现的次数
-d 仅显示有重复的行
-u 仅显示不重复的行
uniq仅对相邻的进行去重 一般要先sort再uniq
找出列出登入系统失败的用户相关信息 最多的ip

lastb | tr -s ' '|cut -d ' ' -f3|sort| uniq -c | sort -t ' ' -nr -k1|head -n1|tr -s ' '|cut -d ' ' -f3
例:取两个文件的相同和不同的行

a.txt中有两个相同123的但b并没有

执行完去重后 uniq -d 显示重复的行发现有123 但b并没有123
所以不符合都属于两个文件
要每个文件单独去重再放在一起再去重
比较文件
diff
-u :输出统一的diff格式文件,适用于补丁文件
--- 代表a.txt 1,6 共6行
+++代表b.txt 共5行

-123 代表a.txt拥有的
+vbn 代表b拥有的
diff -u a.txt b.txt >c.txt
若a或b其中一个丢失 可以用patch来进行恢复
删除b.txt
patch -b a.txt c.txt
这个时候b.txt被还原出来覆盖给了a.txt 所以b.txt现在是a
a.txt为当前文件夹里的a.txt.org
vimdiff
可视化的对比

a.txt.org为最开始的a.txt
a.txt恢复成立b.txt
3. 总结正则表达式的语法
REGEXP:由一类特殊字符及文本字符所编写的模式,其中有些字符不表示字符字面意义,而表示控制与通配的功能,与通配符不同,通配符的功能是用来处理文件名,
而正则表达式是处理文本内容中的字符
采用不同的算法,检查处理正则表达式的软件模块如PCRE
字符匹配
. 匹配任意单个字符除换行
[] 匹配指定范围内任意单个字符
[^] 匹配指定范围内外的任意单个字符
[:alpha:] 任意大小写字符
[[:lower:]] 小写字母
[[:upper:]] 大写字母
[[:blank:]] 空白字符
[[:space:]] 包含空格 制表符 换行符 回车等类型的空白
[[:punct:]] 标点符号
匹配任意单个字符
grep "r..t" passwd

范围匹配
ls /etc/ | grep 'rc[.0-6]'
ls /etc/ | grep 'rc[.0-6].
ls /etc/ | grep 'rc[.0-6]\. \表示转义.将失去匹配单个字符的意义
^不取[]的值


匹配次数
* 匹配前面的字符任意次 包括0次 贪婪模式:尽可能的长的匹配
.* 任意长度的任意字符
? 匹配前面的字符出现0或1次
\+ 匹配前面的字符出现最少一次,即>=1次
\{n\} 匹配前面的字符n次
\{m,n\} 匹配前面字符至少m次 至多n次
\{,n\} 匹配前面的字符至多n次 <=n
\{n,\} 匹配前面的字符至少n次
0次或一次

1次或多次

自定义次数
2次(精确到两次)

2-5次

当有6个时匹配失败
0-2次

匹配正负数

-需要进行转义 在正则中-表示范围
匹配ip


greo -o查看匹配过程发现是一个一个匹配 而ip地址需要四个为一个整体匹配

位置锚定
用于定位出现的位置
^ 行首锚定 以...开头 位于模式的最左侧
$ 行尾锚定 用于模式的最右侧
^....$ 用于匹配整行
^$ 空行
[1]*$ 空白行和空行不同
\< 词首锚定 用于单词模式的左侧
\> 词尾锚定,用于单词模式的右侧
\<....> \ 匹配整个单词
以#开头
grep "^#" /etc/fstab
grep "bash$" /etc/fstab
grep -v "^$" /etc/profile
grep -v "^$" /etc/profile 所有的非空行
排除所有的空行和注释行
grep -v '^$\|^#' /etc/profile
匹配单词(由数字 字母 下划线组成)


[^...]表示...之外的
^表示以..开头
分组其他
### 分组
将多个字符捆绑在一起当作一个整体使用,如(root+)
后向引用:分组括号中的模式匹配到的内容会被正则表达式引擎记录在内部的变量中,方式为\1,\2,\3
\1:表示从左侧起第一个左括号以及与之匹配右括号之间的模式所匹配到的字符
\0:表示正则表达式匹配的所有字符

echo abcabcabc | grep "\(abc\)\{3\}"
从第二行开始 \(abc\) \表示转义左右括号 ()包起来的为整体出现三次
echo abc-def-abcabcabc | grep "^\(abc\)-\(def\)-\1\{3\}"
整个句子都是匹配语句
先匹配()里的abc-def- 然后再后向引用匹配第一个括号的即abc匹配三次
后向引用引用前面的分组括号中的模式所匹配字符而非模式本身

echo 123123123 | grep "\([0-9]\{3\}\)\1"
匹配()里为0到9至少出现三次的数字 匹配123 三次
但如果改成了123456123匹配将失败 因为后向引用的是字符还非模式本身
\1匹配到的是123就已经将123与\1进行绑定 所以123456123并没有出现(123)这一个整体出现3次
echo 123456123| grep "\([0-9]\{3\}\{2\})"
相反以上的并没有使用正则表达式 这的意思是 连续出现0-9的数字三次 这个出现两次即三个数字为一个整体

或者
|
a|b :a或者b
C\|cat:C或cat
\(C|c\)at : Cat 或 cat


扩展正则表达式
### 字符匹配
. 匹配单个字符
[] 指定范围的字符
[^]不在指定范围内的字
匹配次数
* 匹配前面字符任意次
? 0或1次
+ 一次或多次
{n}匹配n次
位置锚定
^ 行首
$ 行尾
\< 词首
\>\ 词尾
分组其他
() 分组
| 或者
a|b
扩展正则去除\更加的方便 使用grep -E
4. 文本三剑客相关的总结
grep
-E 扩展正则
-e 实现多个选项间的逻辑与关系
-f 从文件中读取匹配规则 每行一条
-i 忽略大小写
-w 匹配整个单词
-v 与匹配的字符取反
-m 只匹配m行
-n 显示匹配的行号
-q 静默模式 不输出任何信息,输入 echo $? 查看命令是否执行成功
-r 递归目录 但不递归有软链接指向的地方
-R 递归目录,也递归有软链接的
-l 只显示匹配上的文件名
-c 统计匹配的次数
-o 仅显示匹配到的字符串

输入grep root 也支持输入重定向
取反

静默模式

0表示该条指令执行成功
grep --e 显示root行或匹配bash行

从文件读取规则


命令行展开

扩展正则

匹配单词
过滤掉文件的空行和注释行

算出所有人的年龄总和


5. 总结程序的组成相关知识点
程序 一组计算机能识别和执行的指令,运行于电子计算机上,满足人们某种需求的信息化工具。它以某些程 序设计语言编写,运行于某种目标结构体系上。
Niklaus Wirth: Algorithm+Data Structures=Programs
尼古拉斯·沃斯:瑞士计算机科学家,伯克利博士,图灵奖得主,Pascal语言创始人,名言:算法+数据 结构=程序 算法 算法是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,代表着用系统的方法描述解决 问题的策略机制。 数据结构 数据结构是计算机存储、组织数据的方式。
数据结构是指相互之间存在一种或多种特定关系的数据元素 的集合。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。 数据 是程序的核心,程序为数据提供服务,也是互联网公司最重要的资产
6. 总结变量命名规则,不同类型变量(环境变量,位置变量,只读变量,局部变量,状态变量)如何使用。
shell 中变量命名法则
### 命名要求
- 区分大小写
- 不能使用程序中的保留字和内置变量
- 只能使用数字下划线且不以数字开头
变量定义与引用
- 普通变量:生效范围为当前shell进程,对当前shell之外的其他shell子进程,包括当前shell的子进程都无效
- 环境变量:生效范围为当前shell进程及子进程
- 本地变量:生效范围为当前shell进程中某代码片段,通常指函数
### 变量赋值
可以是以下多种形式

name='root'
name="$USER" 变量引用
name=COMMAND 命令引用
变量赋值是临时生效,退出终端后变量自动删除无法持久保存,脚本中的变量会随脚本结束。
变量引用
$name
${name}
弱引用和强引用
"$name":其中变量引用不会被替换为变量值,而保持原字符串
'$name':弱引用,其中的变量会被替换为变量值

变量引用

echo $name_$age bash会将name_当作变量
间接引用

类似于c里的指针这里 title=$name只是将值赋给了title 并不是地址
变量追加值

添加颜色变量

COLOR为引用变量
当前进程和子进程

上面说过相对路径执行和. (空格)执行时前者会创建新的shell子进程 而与当前shell的进程号一样
因此当在脚本中创建的变量 使用相对路径时shell有新的子进程 当执行完后回到主进程时 此变量失效
显示变量
set
unset 删除变量
环境变量
- 使子进程包括孙子进程继承父进程的变量,但是无法让父进程使用子进程的变量
- 一旦子进程修改了从父进程继承的变量,将新的值传递给孙子进程
- 一般在系统配置文件中使用


这是当前进程中的环境变量

环境变量的声明 export var2=name
在脚本中声明的var1并没有输出因为相对路径创建了一个新的shell子进程,这个子进程中没有var1这个变量的值,但var2可以因为环境变量对当前shell和子进程都有效

当以. 空格执行脚本时是以当前的shell为进程所以当前shell可以找到在最开始定义的变量
只读变量
只能声明定义,但后续不能修改和删除
readonly name

readonly 查看当前只读变量
位置变量
在bash shell中内置的变量,在脚本代码中调用通过命令行传递给脚本的参数
$1,$2 对应1,2个参数 shift[n] 换位置
$ 0命令本身包括路径
$* 传递给脚本的所有参数,全部参数合为一个字符串
$@ 传递给脚本的所有参数,每个参数为独立字符串
$# 传递给脚本的参数的个数


rm的安全实现
回收站机制


设置别名当删除时执行脚本 rm

f{1..10}.txt 将被当作参数传递给脚本
则$*将这么多文件当作一个整个字符串

$#和$@的区别
f1.sh

f2.sh

file.sh

只输出传进来的第一个参数

退出状态码变量
$? :0代表成功1-255代表失败
用户可以在自定义脚本中使用exit [n]
来自定义状态码
当脚本遇到exit命令,脚本会立即终止,终止退出状态取决于exit命令后面的数字
- 若exit后无数字 那就取决于exit命令前面的命令是否执行成功的结果
- 若无exit命令,则由整个脚本的最后一条命令的状态码决定
展开命令行
展开命令行的执行顺序

**\ **:防止扩展 使随后的字符按原意解释
' ':防止所有扩展不展开命令变量
" ":也可以防止扩展但是以下情况例外 $
变量扩展
` `:反引号,命令替换
\:禁止单个字符扩展
当执行echo \ 这时不会执行命令因为这个\在等待下一个字符来判断是否进行转义



``中的\要两个才能完成转义 因此在反引号中一个斜杠没啥用
而$()里的只需要一个就可以完成转义
7. 编写一个脚本猜数字,每次提示用户比目标数字是大还是小,直到猜成功位置


[:space:] ↩︎

浙公网安备 33010602011771号