linux三剑客
Linux三剑客~grep awk sed——Linux下一切皆文件,对Linux的操作就是对文件的处理,所以三剑客其实本质上就是Linux所有文档处理的帮助命令,认真学习将对你未来的道路打下坚实的基础。
1.grep:使用正则表达式搜索文本,并把匹配的行打印出来,是强大的文本搜索工具;
2.sed:用于编辑匹配到的文本,是一种流编辑器;
3.awk:能够对文本进行复杂的格式处理,是一种处理文本的语言。
awk
awk 它适合文本处理和报表生成,其语法较为常见,借鉴了某些语言的一些精华,如C语言等。
awk 可以进行样式装入、流控制、数学运算、流程控制,还有内置的变量和函数,具备一个完整语言所应具有的几乎所有完美特性,相当于一个小型编程语言。
awk 是以文件的一行为处理单位的,awk每接收文件的一行,就执行相应的命令。awk是逐行处理的,当awk处理一个文本时,会一行一行进行处理,处理完当前行,再处理下一行,awk默认以”换行符”为标记,识别每一行,也就是说,awk跟我们人类一样,每次遇到”回车换行”,就认为是当前行的结束,新的一行的开始,awk会按照用户指定的分割符去分割当前行,如果没有指定分割符,默认使用空格作为分隔符。
2.1基本命令格式:
awk '{pattern + action}' <file>
或者
awk [options] ‘Pattern{Action}’ file
pattern表示在数据中要查找的内容
action表示要执行的一系列命令~动作
file表示对应的文件
从字面上理解 ,action指的就是动作,awk擅长文本格式化,并且将格式化以后的文本输出,所以awk最常用的动作就是print和printf,因为awk要把格式化完成后的文本输出啊,所以,这两个动作最常用。
action:
例子:打印第1,2,3列内容
用指定字符来拼接
两种特殊模式
begin和end模式
Begin意为开始,指定了处理文本之前需要执行的操作
End意为结束,指定了处理完文本之后要执行的操作
例如:
参数(变量):
FS:输入字段分隔符, 默认为空白字符
OFS:输出字段分隔符,默认为空白字符
RS:输入记录分隔符(输入换行符), 指定输入时的换行符
ORS:输出记录分隔符(输出换行符),输出时用指定符号代替换行符
NF:number of Field,当前行的字段的个数(即当前行被分割成了几列),字段数量
NR:行号,当前处理的文本行的行号。
FNR:各文件分别计数的行号
FILENAME:当前文件名
ARGC:命令行参数的个数
ARGV:数组,保存的是命令行所给定的各参数
1.分隔符:
(字段)输入分隔符:-F。或者-v -FS=‘。’
把文档中的。。。作为分隔符
加上-v结果一样
(字段)输出分隔符:-OFS=“。。。”
把原有的分隔符用新的。。。替代显示出来
(行)输入分隔符:-v RS=".."
指定。。作为行之间的分隔符。不写RS则表示默认,是回车。引号内不写内容则表示空格作为行的分隔符
(行)输出分隔符:-v ORS=“。”
组合使用:把原有的a当作分隔符,替换成-。-
2.显示行号
行号:NR
字段数:NF
对多文件分别计数的行号:FNR
其他变量
filename:此处意为显示文件名
ARGC:命令行参数的个数
ARGV:数组,保存的是命令行所给定的各参数
上图中我们发现ARGV[?]中的?是数字,这个数字代表什么意思呢,你的命令中有第几个命令参数,比如[0]代表awk也就是最开始,[1]代表1.txt,不对啊,[1]应该是print啊,但是在awk就是这么规定的,pattern{ action }不被看作是参数,所以[1]就成了1.txt了,而因为[2]不存在,所以没输出内容
自定义变量:
方法一:-v varname=value 变量名区分字符大小写。
方法二:在program中直接定义
方法1.变量外面的引号可以是单引号也可以是双引号
方法2.变量外面的引号必须是双引号
如果我们想定义多个变量
用;号隔开即可
如果你希望变量中间没有空格,则用空格隔开,逗号“,”会被识别为分隔符
grep
- 正则表达式用于匹配对应的条件,完成文本的筛选或处理
常用的支持正则表达式的命令
grep~egrep~sed~awk~pgrep~mkdir~touch等
(egrep支持扩展正则表达式)
(pgrep是查看进程的)
使用grep
-i 大小写均可
-n 打印行号
-v 反向匹配
-w 精确匹配
grep: 负责从数据源中检索对应的字符串,行过滤。
grep用于根据关键字进行行过滤
grep options 'keys' filename
OPTIONS:-i: 不区分大小写-v: 查找不包含指定内容的行,反向选择-w: 按单词搜索-n: 显示行号-A: 显示匹配行及后面多少行 -A 5-B: 显示匹配行及前面多少行-o: 打印匹配关键字-c: 统计匹配到的次数-r: 逐层遍历目录查找-C: 显示匹配行前后多少行-l:只列出匹配的文件名-L:列出不匹配的文件名-e: 使用正则匹配-E:使用扩展正则匹配^key:以关键字开头key$:以关键字结尾^$:匹配空行--color=auto :可以将找到的关键词部分加上颜色的显示常用命令选项必知必会 示例:
# grep -i root passwd 忽略大小写匹配包含root的行
# grep -w ftp passwd 精确匹配ftp单词
# grep -wo ftp passwd 打印匹配到的关键字ftp
# grep -n root passwd 打印匹配到root关键字的行好
# grep -ni root passwd 忽略大小写匹配统计包含关键字root的行
# grep -nic root passwd 忽略大小写匹配统计包含关键字root的行数
# grep -i ^root passwd 忽略大小写匹配以root开头的行
# grep bash$ passwd 匹配以bash结尾的行
# grep -n ^$ passwd 匹配空行并打印行号
# grep ^# /etc/vsftpd/vsftpd.conf 匹配以#号开头的行
# grep -v ^# /etc/vsftpd/vsftpd.conf 匹配不以#号开头的行
# grep -A 5 mail passwd 匹配包含mail关键字及其后5行
# grep -B 5 mail passwd 匹配包含mail关键字及其前5行
# grep -C 5 mail passwd 匹配包含mail关键字及其前后5行
现在开始学习正则表达式
[a-z] 小写字母
[A-Z] 大写字母
[0-9] 数字
[a-zA-Z0-9] 表示所有数字和英文字符
^ 表示行开头
$ 表示行结尾
^$ 表示空行
. 代表一个字符,可以连续使用,但不能为空
* 代表一组字符,可以为空
.* 表示存在至少一个字符,可以为空
/<用来表示词首
>/用来表示词尾
扩展正则表达式
| 或者or
() 分组,改变操作符优先级
+ 匹配前面的子表达式一次或多次**
? ** 匹配前面的子表达式零次或一次
{n} 匹配前面的子表达式n次
{n,} 匹配前面的子表达式至少n次
{n,m} 匹配前面的子表达式至少n次且不超过m次
匹配筛选内容:
sed
是一种在线编辑器,它一次处理一行内容。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。
sed [参数] [动作(内容)] 文件名
sed -i 's/要被取代的字串/新的字串/标志' test.txt
参数如下:
-n :使用安静(silent)模式。则只有经过sed 特殊处理的那一行(或者动作)才会被列出来(sed会把源文件内容和查询得到的结果同时展现出来,-n只显示查询得到的结果)。
-e :直接在命令列模式上进行 sed 的动作编辑(同时执行多个【动作】);
-f :直接将 sed 的动作写在一个文件内, -f filename 则可以运行 filename 内的 sed 动作;
-r :sed 的动作支持扩展正则表达式。(默认是基础正规表示法语法)
-i :直接修改读取的文件内容,而不是输出到终端。
动作如下:
a :新增,在行后新增
c :取代
d :删除,
i :插入,在行前插入
p :列印(即显示),通常p会与参数sed -n一起运行
s:取代,通常这个 s 的动作可以搭配正规表达式例
例如:
添加:i
查询:
sed -i 's/要被取代的字串/新的字串/标志' test.txt
标志:
g 全局替换(替换所有匹配项)
数字 替换第 n 个匹配项(如 2 表示替换每行的第二个匹配项)
p 打印替换后的行(通常与 -n 选项配合使用)
w 将替换后的行写入文件(如 w output.txt)
i 忽略大小写(如 s/a/b/i 会匹配 A、a 等)
m 多行模式(配合 ^ 和 $ 使用,匹配跨多行的内容)
元字符集
^ 以什么为开始
$ 以什么为结束(最后一行)
. 代表匹配一个字符
.* 代表匹配所有
[] 配置括号内的内容[0-9][a-z][A-Z]
[^h] 不包括h的内容进行匹配
\(..\) 匹配字符串,保存匹配的字符串,其他的替换
常用数据处理命令(了解)
数据检索命令行检索:grep egrep字符串检索:cut tr数据处理命令 数据排序:sort数据去重: uniq文本数据合并: paste数据输出: tee数据处理: xargs
cut
切割字符串,按照顺序来获取某部分内容。(相当于awk)
cut用于列截取
-c: 以字符为单位进行分割。
-d: 自定义分隔符,默认为制表符。\t
-f: 与-d一起使用,指定显示哪个区域。# cut -d: -f1 1.txt 以:冒号分割,截取第1列内容
# cut -d: -f1,6,7 1.txt 以:冒号分割,截取第1,6,7列内容
# cut -c4 1.txt 截取文件中每行第4个字符
# cut -c1-4 1.txt 截取文件中每行的1-4个字符
# cut -c5- 1.txt 从第5个字符开始截取后面所有字符
tr
从标准输入中通过替换或删除操作进行字符转换
主要用于删除文件中控制字符或进行字符转换。
使用tr时要转换两个字符串:字符串1用于查询,字符串2用于处理各种转换。语法:(可以看下面的例子)
命令1|tr '字符串1' '字符串2' #把命令一的执行结果里,字符串1替换为字符串2
tr '字符串1' '字符串2' < filename #把文件里的字符串1替换成字符串2tr 选项 'string1' < filename #根据对应选项对字符串1进行操作-d 删除字符串1中所有输入字符。
-s 删除所有重复出现字符序列,只保留第一个;即将重复出现字符串压缩为一个字符串。a-z 任意小写
A-Z 任意大写
0-9 任意数字# tr -d '[:/]' < 3.txt 删除文件中的:和/
# cat 3.txt |tr -d '[:/]' 删除文件中的:和/
#tr 'A' 'e' < 1.txt 将文件中A替换为e
# tr '[0-9]' '@' < 3.txt 将文件中的数字替换为@符号
# tr '[a-z]' '[A-Z]' < 3.txt 将文件中的小写字母替换成大写字母
# tr -s '[a-z]' < 3.txt 匹配小写字母并将重复的压缩为一个
# tr -s '[a-z0-9]' < 3.txt 匹配小写字母和数字并将重复的压缩为一个
sort
排序显示,默认排序规则是按照首字母的字符编码。
sort:将文件的每一行作为一个单位,从首字符向后,依次按ASCII码值进行比较,最后将他们按升序输出。语法:
sort [options] [filename]-u :去除重复行
-r :降序排列,默认是升序
-o : 将排序结果输出到文件中 类似 重定向符号 >
-n :以数字排序,默认是按字符排序
-t :分隔符
-k :第N列,指定列来排序-b :忽略前导空格。
-R :随机排序,每次运行的结果均不同。示例:
# sort -n -t: -k3 1.txt 按照用户的uid进行升序排列
# sort -nr -t: -k3 1.txt 按照用户的uid进行降序排列
# sort -n 2.txt 按照数字排序
# sort -nu 2.txt 按照数字排序并且去重
# sort -nr 2.txt
# sort -nru 2.txt
# sort -nru 2.txt
# sort -n 2.txt -o 3.txt 按照数字排序并将结果重定向到文件
# sort -R 2.txt
# sort -u 2.txt
uniq:
去重
uniq:去除连续重复行语法:
uniq [options] [filename]-i: 忽略大小写
-c: 统计重复行次数
-d:只显示重复行# uniq 2.txt
# uniq -d 2.txt
# uniq -dc 2.txt
tee
双向输出,在屏幕上输出内容时,将内容保存到文件中
tee工具从标准输入读取并写入标准输出和文件,即:双向覆盖重定向<屏幕输出|文本输入>
somecommand |tee filename-a 双向追加重定向# echo hello world
# echo hello world|tee file1
# cat file1
# echo 999|tee -a file1
# cat file1
paste
将多个文件按列合并且输出,不改变源文件
paste工具用于合并文件行输出到屏幕,不会改动源文件-d:自定义间隔符,默认是tab,只接受一个字符
-s:将每个文件中的所有内容按照一行输出,文件中的行与行以TAB间隔。[root@zuolaoshi shell01]# cat a.txt
hello
[root@zuolaoshi shell01]# cat b.txt
hello world
888
999
[root@zuolaoshi shell01]# paste a.txt b.txt
hello hello world888999
[root@zuolaoshi shell01]# paste b.txt a.txt
hello world hello
888
999[root@zuolaoshi shell01]# paste -d'@' b.txt a.txt
hello world@hello
888@
999@[root@zuolaoshi shell01]# paste -s b.txt a.txt
hello world 888 999
hello
xargs 上一个命令的输出作为下一个命令的命令行参数
管道(|):上一个命令的输出作为下一个命令的输入,做的是数据源。
shell字符(特殊符号):
有基础的同学不要和正则表达式中的符号含义搞混淆了。 !: 执行历史命令 !! 执行上一条命令$: 获取变量的值$(命令) 获取命令的执行结果+ - * / %: 对应数学运算 加 减 乘 除 取余数 &: 后台执行,写在命令结尾&& 与运算& > 将标准输出和标准错误输出都重定向到一个文档
补充:
jobs:查看后台进程号
bg 编号:放到后台继续执行
fg 编号:放到前台继续执行
如果我们正在编写一个内容不想按wq暂时保存,可以使用ctrl+z挂起,然后想要恢复时
查看他的编号,然后放到前台继续执行即可。;: 分号可以在shell中一行执行多个命令,命令之间用分号分割 \: 转义字符``: 反引号 命令中执行命令 echo "today is `date +%F`"' ': 单引号,脚本中字符串要用单引号引起来,但是不同于双引号的是,单引号不解释变量" ": 双引号,脚本中出现的字符串可以用双引号引起来通配符 ~: 家目录 # cd ~ 代表进入用户家目录*: 星号是shell中的通配符 匹配所有?: 问号是shell中的通配符 匹配除回车以外的一个字符[list]: 匹配[list]中的任意单个字符
[!list]: 匹配除list中的任意单个字符
{string1,string2,...}: 匹配string1,string2或更多字符串重定向
> 覆盖输入
>> 追加输入
< 输出
<< 追加输出管道命令
|: 管道符 上一个命令的输出作为下一个命令的输入 cat filename |