Linux三剑客

前言

关于bash
bash:命令处理器,运行在文本窗口,能够执行用户输入的命令。
脚本:从linux文件中读取命令,被称为脚本。

1 命令:alias:起别名
2 快捷键操作:
ctrl+a:光标最左
ctrl+e:光标最右
ctrl+k:光标后面全删
ctrl+l:clear清屏
tap:命令补全
3. 特别的:
linux文件的文档每一行末尾都有 符,空白行也一样利用 c a t − E n p w d . t x t 发现所有内容末尾都有 符,空白行也一样 利用cat -En pwd.txt发现所有内容末尾都有 符,空白行也一样利用catEnpwd.txt发现所有内容末尾都有

关于正则表达式
基本正则表达式:BRE:regular expression
扩展正则表达式:ERE:extend regular expression
Linux三剑客的用途
grep:linux文本查找,一般不改变原文件
sed:linux文本替换,加-i可以改变原文件
awk:linux文本格式化后显示,一般不改变原文件,像Excel格式
以上三者,都是按行操作,一行行去操作

关于正则表达式和扩展正则表达式

普通正则表达式:
Linux三剑客_第1张图片
Linux三剑客_第2张图片
扩展正则表达式:
grep和sed使用需加: -E
Linux三剑客_第3张图片
+:匹配前一个1次或多次
a{n, m}:注意是花括号{},重复前面的a至少n次,最多m次。
[abc]:匹配abc中任意字符1次,带上+,就是匹配前面1次或多次。

grep

选项:
Linux三剑客_第4张图片
-v:取反,是比较常用的操作
grep [选项] [模式]
grep 单引号和双引号:一般用单引号,有变量用双引号

grep入门练习

·练手材料

cat /etc/password > pwd.txt
  1. 查找root行,忽略大小写
    -i:忽略大小写
    可以利用grep --help查看各种选项
grep root -i pwd.txt
  1. 统计有多少root有关的行,显示行号
    -c:统计
    可以利用grep --help查看各种选项
grep root pwd.txt -c -n
  1. 统计空行以外所有行和号
    匹配空行用^$,起始和末尾中间是空
    显示行号 -n // 也可以加到-v
    取反 -v
grep '^$' pwd.txt -n -v
  1. 显示非注释行,注释行以#开头
grep '^#' -n  -v pwd.txt
  1. 找所有m开头的,不论大小写
    -n:显示行号
    -i:忽略大小写
grep -i '^m' pwd.txt -n
  1. 输出以.结尾的行
    当要匹配的是正则表达式特殊符号时,加转义反斜杠
    -o 可加可不加,加上把行上其它内容去掉
grep -n '.$' pwd.txt
  1. 匹配有good和glod的行
    ():分组过滤,()内是一个整体,可以被\1引用,且是扩展正则,需要加-E
grep -E '(good|glod)' pwd.txt
  1. 匹配‘lxxe’,且这个词需要出现至少两次,这两次的中间可以有任意内容
    Linux三剑客_第5张图片
  2. 寻找带af或NZ或8~9的数字
    Linux三剑客_第6张图片
  3. 找到所有大写字母或者带数字的行
    Linux三剑客_第7张图片
    如果是[]带^,就是排除

grep练习题

回忆正则表达式和扩展正则表达式

^:表示锚定行首,此字符后面的任意内容必须出现在行首,才能匹配。
$:表示锚定行尾,此字符前面的任意内容必须出现在行尾,才能匹配。
^$:表示匹配空行,这里所描述的空行表示"回车",而"空格"或"tab"等都不能算作此处所描述的空行。
^abc$:表示abc独占一行时,会被匹配到。
<或者\b :匹配单词边界,表示锚定词首,其后面的字符必须作为单词首部出现。
>或者\b :匹配单词边界,表示锚定词尾,其前面的字符必须作为单词尾部出现。
\B:匹配非单词边界,与\b正好相反。
特别的扩展正则表达式:加-E
在基本正则表达式中,{n} 表示前面的字符连续出现n次,将会被匹配到。
在扩展正则表达式中,{n} 表示前面的字符连续出现n次,将会被匹配到。
在基本正则表达式中,( ) 表示分组,(ab) 表示将ab当做一个整体去处理。
在扩展正则表达式中,( ) 表示分组,(ab) 表示将ab当做一个整体去处理。

grep使用习惯

  1. grep做题用双引号
  2. >、<,其实像一对<>,显然<是起始,而>是结尾。分隔符不管是空格 还是 : ,grep自动能识别分隔符。
  3. 用扩展正则时,””,可以少写\,用()表示分组。()不用加\
  4. 扩展正则表达式中的>或<,还是得加\
  1. 找出root有关行
    在这里插入图片描述

  2. root开头的行
    开头:用^

grep '^root' pwd.txt
  1. root开头或sync开头
    grep匹配建议都用"",如下括号前不必加反斜杠
    要用到(),使用选项:-E
    Linux三剑客_第8张图片

  2. 找出bin开头的行,要行号
    行号 -n
    在这里插入图片描述

  3. 找出非root开头的行
    取反 -v:
    Linux三剑客_第9张图片

  4. 统计
    先grep再加管道:| wc -l
    在这里插入图片描述

  5. 最多匹配root3次
    -m选项,直接加3
    在这里插入图片描述

  6. 匹配多个文件,列出存在信息的文件名称
    grep --help:
    -l:匹配到的文件名,
    -L:匹配不到的文件名
    在这里插入图片描述

  7. 显示不以/bin/bash结尾的行
    结尾用$,取反用 -v,下面忘了加 -v
    在这里插入图片描述

  8. 文件中2位数或3位数字的行
    让数字重复2~3次。
    [0-9]{2,3}
    Linux三剑客_第10张图片
    第一个绿色错误:因为655,符合数字出现3次,而34符合出现2次,所以看到65534和65534标红,而1000中100匹配到是因为匹配到了三次,而后面的单独0,匹配不到,因为最多3次。
    所以需要增加一个结尾标志符
    这样,数字的后面必须是特殊符号
    Linux三剑客_第11张图片

  9. 找出文件中所有大小写i开头的行
    两种写法:
    grep -i:忽略大小写
    在这里插入图片描述
    或者忽略大小写:
    在这里插入图片描述
    或者【】包裹或关系的字符
    在这里插入图片描述

  10. 找出文件中至少一个空白字符开头,后面非空字符的行
    文件中有纯空格的行和空行。
    别匹配到纯空格行
    空格:[[:space:]]
    以空格开头即可
    Linux三剑客_第12张图片
    但是我不要纯空格行,怎么去?加上一个去掉纯空格行的命令,管道纯空格取反,其实下面应该写*,而不是以$结尾,但是这样也行的
    在这里插入图片描述
    下面也可以在这里插入图片描述

  11. root,dwj,nobody用户的信息
    ()需要扩展表达式,-E
    空格记得别乱加,这个用老方式,以各行开头,取或即可
    “^(a|b|c)”
    Linux三剑客_第13张图片

  12. 找出文件中的函数名,字符串后面跟着括号
    函数必须字母开头:^加字母
    后面是任意数字,但是最后需要是()。在这里插入图片描述如果文本有空格,适合sed查找。

  13. 找出用户名和shell相同的用户?
    分析:什么是和shell相同的用户?
    解释器在最后一列,而用户是开头,所以以:分割,找开头和结尾相同的。

思路:匹配第一个:前面出现出现的词且末尾也要出现一次。
匹配到:结尾而不要:,[^:],意思是不要引号,然后它应该再重复一遍,所以圈起来,中间可以是任意,所以用.*,而要匹配到末尾,出现一次,所以要用\1,一定要加$
使用:“(^[^:]*).*\1$”,
Linux三剑客_第14张图片
以上的错误在于后面使用.*,匹配到了全部。
加上>,确定词尾,意思是匹配到前面就停止。
技巧,用\1的部分,最好加上>。

sed

sed的选项:
-i:对原始文本做替换
-n:取消默认输出
-e:多次编辑
-r:支持正则扩展

Linux三剑客_第15张图片
sed的内置字符:
Linux三剑客_第16张图片
·与grep的相同点:
sed和grep均不考虑分隔符,因为只是做匹配和匹配替换
·与grep的区别:

  1. sed尽量使用单引号’’
  2. sed的扩展正则是-r,-e是多次编辑

sed练习题

1 替换文件的root为dwj,只替换一次
sed的替换,用s杠杠杠///
要显示加上p
仅仅打印用-i

sed 's/root/dwj/p' pwd.txt

只是替换root,而不是开头的
在这里插入图片描述

2 替换文件所有root为dwj,仅打印替换结果
所有的,用g

sed 's/root/dwj/gp' pwd.txt

在这里插入图片描述

3 替换前10行b开头的用户,改为c,仅仅打印替换的结果
前10行,加在s前面,1, 10

sed  '1, 10s/^b/c/p' pwd.txt

在这里插入图片描述

4 替换前10行b开头改为c且m开头改为n
前10行,在’'中加1,10即可
连续做两次,-e即可

sed -e '1,10s/^b/c/' -e '1,10s/^m/n/p' pwd.txt

在这里插入图片描述

5 删除4行后面的行
后5到末尾的行:5,$
删除加:d

sed '5,$d' pwd.txt

在这里插入图片描述

6 删除从root开始到ftp之间的行
既然也是行,就用逗号隔开
删除加d即可

sed '/^root/,/^ftp/d' pwd.txt

Linux三剑客_第17张图片

7 删除文件中空白字符开头的行,添加注释符
这个是需要替换,删除还添加,做个替换即可。
匹配开头是空格的空格,并且替换为@\1,此外,-r表示扩展正则表达式
在这里插入图片描述

8 删除文件中空白行和注释行

sed 's/(^$|#)//d' pwd.txt

数据:
Linux三剑客_第18张图片
grep ‘^$’得到空行,不是空格行(因为一般没有空格行)

而要找空行就是第8行
操作注释行的删除
数据 lk:
Linux三剑客_第19张图片

先删除空白行:
sed ‘/^$/d’ lk
发现空白行消失了,空格行还在
Linux三剑客_第20张图片

删除注释行
找某行,都是用杠杠//即可,不用三个杠杠杠
sed ‘/^#/d’ lk
发现#行删除了
Linux三剑客_第21张图片
两种合并用-e:
sed -e ‘/^$/d’ -\e ‘/^#/d’ lk
空格行和注释行都被删除了。

9 文件前三行,添加@
其实是替换开头内容为原始多加一个@
所以用\1,(),需扩展表达式 -r

sed -r '1,3s/^(.)/@\1/p' pwd.txt

Linux三剑客_第22张图片

10 取出ip地址,两种方式
ifconfig eth0,显示物理网卡内容,加管道,sed 取第二行,2p即可
字符串替换前面的内容为空
多个管道,做替换即可,注意每次都需要-n,取消默认显示内容
在这里插入图片描述
在这里插入图片描述


11 找出系统版本
/etc/centos-release
把这一串中的第一个数字拿到即可
在这里插入图片描述
思路把release之前都替换掉,然后把第一个点后面的的内容都替换掉
在这里插入图片描述
也可以是:
在这里插入图片描述

awk

awk选项参数
Linux三剑客_第23张图片
-F需要搭配双引号使用,指定读取的分隔符,允许使用两种分隔符。
Linux三剑客_第24张图片
与grep和sed的区别:
awk只用两个//,因为它只做查找并显示成Excel的格式
awk的模式
要对某个列做限定,需要用匹配正则,加飘~
Linux三剑客_第25张图片

内置变量
以下都是针对awk的
RS:awk输入换行符修改
ORS:awk输出换行符修改
NR:行号,当前处理的文本行的行号
NF:列号
FNR:各文件分别计数的行号
FILENAME:当前文件名字
ARGC:命令行参数的个数
ARGV:数组,保存命令行给定的各个参数
数字搭配$会显示当前列。
小试身手:
1 $0显示每一行
Linux三剑客_第26张图片
2 NF是行号
Linux三剑客_第27张图片
3 选定行号输出 NR==2,结果只有一行输出
在这里插入图片描述
4 可以在动作之前加模式,开始或结束输出,也在单引号中
Linux三剑客_第28张图片

5 也可以输出参数
Linux三剑客_第29张图片

awk练习题

1 在当前系统中打印出所有普通用户的用户和家目录
需要加条件:第3列>=1000,大于等于1000才是普通用户ID,在{}前面加
awk -F":" ‘$3>=1000{print $1, $NF}’ pwd.txt
在这里插入图片描述
2 给txt文件的前5行添加#号
awk添加内容,只是显示上,所以直接读取前5行,多打印输出一个内容即可。
在这里插入图片描述
3 统计文本信息
名 姓 区号 电话 三个月捐款数量
Mike Harrington:[510] 548-1278:250175
Christian Dobbins:[408] 538-2358:155:90:201
Susan Dalsass:[206] 654-6279:250:60:50
Archie McNichol:[206] 548-1348:250175
Jody Savage:[206] 548-1278:15:188:150
Guy Quigley:[916] 343-6410:250175
Dan Savage:[406] 298-7744:450:300:275
Nancy McNeil:[206] 548-1278:250:80:75
John Goldenrod:[916] 348-4278:25017
Chet Main:[510] 548-5258:50:95:135
Tom Savage:[08] 926-3456:250:168:200
Elizabeth Stachelin:[916] 440-1763:175:75:300
因为数据以:、空格切分,所以分隔符用[: ]两种选择
Linux三剑客_第30张图片

空格行,要删除,所以加匹配项,要取反。
awk正则匹配,用两个//就行了。此外,去除空行,用!取反即可。
Linux三剑客_第31张图片
4 显示Tom电话
tom是名,在第一列,在开头,像上一题匹配空行一样,直接匹配即可
在这里插入图片描述
5 显示Nancy姓名、区号、电话
在这里插入图片描述
6 显示所有D开头的姓
要对某个列做匹配,需要用匹配正则,加飘~
姓在第二列,而要对第二列做正则匹配,就得在
//前面加列和~,后面才是正则表达式
在这里插入图片描述
注意列匹配放在/最前面,且带上飘~。
也是两个//
7 显示所有区号是916的人名
区号916,用[916],但是防止[916]被识别为正则表达式的或选择
在这里插入图片描述
8 显示Mike捐钱信息,每一项加美元符
在这里插入图片描述
9 显示所有人的姓+逗号+名

记得最前面取反,去空行
然后姓、名无非是$2,$1反着写
Linux三剑客_第32张图片
10 修改文件内置输出符
-v OFS=”,”
Linux三剑客_第33张图片
11 删除文件空白行
也就是个匹配空白,取反操作。
Linux三剑客_第34张图片

你可能感兴趣的:(linux)