Shell文本处理

shell

通配符

符号 作用
* 匹配0个或任意多个字符
匹配一个任意字符
[] 匹配中括号中的任意字符,[abc]匹配a,或b,或c
[-] -代表一个范围,如[a-z]代表匹配小写字母
[^] 逻辑非,匹配不是括号内的字符,如[ ^0-9 ] ,代表匹配非数字字符

正则表达式

基础正则表达式

符号 作用
* 前一个字符匹配0次或任意次
. 匹配除换行符以外的任意一个字符
^ 匹配行首
$ 匹配行尾
[] 匹配中括号中的任意一个字符,[a]匹配a
[^] 逻辑非,匹配非中括号中的任意一个字符
\ 转义符
\ {n\ } 前面的字符恰好出现n次,如[0-9]\ {4\ },匹配四位数字
\ {n,\ } 前面的字符出现不小于n次,如[0-9]\ {2,\ },匹配两位及以上的数字
\ {n,m\ } 前面的字符出现至少n次,最多m次,如[a-z]\ {6,8\ },匹配6-8位的小写字母

扩展正则表达式

符号 作用
+ 前一个字符匹配1次或任意多次
前一个字符匹配0次或1次。
匹配两个或多个分支选择
() 匹配其整体为一个字符

文本操作四剑客

grep , cut, sed ,awk 文本字符串操作四剑客的区别

grep:用于查找匹配的行

cut: 截取数据. 截取某个文件中的列, 重点是按照列分割, 这个命令不适合截取文件中有多个空白字符的字段

sed: 增删改查数据. sed用于在文件中以行来截取数据进行增\删\改\查

awk:截取分析数据. 可以在某个文件中是以竖列来截取分析数据, 如果字段之间含有很多空白字符也可以获取需要的数据, awk是一种语言,可以深入分析文件数据

grep

在文件中搜索匹配的字符串行,包含匹配。

语法

grep [选项] “搜索内容” 文件名

选项

-i 忽略大小写

-n 输出行号

-v 反选查找,搜索 不包含“搜索内容”的内容,与!一样,反向的意思。

cut

切割提取指定列\字符\字节的数据

语法

1
cut [options]  filename

options参数说明

选项参数 功能
-f 提取范围 列号,获取第几列
-d 自定义分隔符 自定义分隔符,默认为制表符。
-c 提取范围 以字符为单位进行分割
-b 提取范围 以字节为单位进行分割。这些字节位置将忽略多字节字符边界,除非也指定了 -n 标志。
-n 与“-b”选项连用,不分割多字节字符;

提取范围说明

提取范围 说明
n- 提取指定第n列或字符或字节后面所有数据
n-m 提取指定第n列或字符或字节到第m列或字符或字节中间的所有数据
-m 提取指定第m列或字符或字节前面所有数据
n1,n2,… 提前指定枚举列的所有数据

小结

cut切割提取列

cut -d 分隔符切割 -f 提取第X列 文件或数据

cut切割提取字符

cut -c 提取字符范围 文件或数据

cut切割提取字节

cut -nb 提取直接范围 文件或数据

sed

用于编辑文本

sed (stream editor, 流编辑器) 是一款非交互流式文本编辑器

vim是交互式文本编辑器

增、删、改、查等操作,支持按行、按字段、按正则匹配文本内容.

语法

1
2
3
4
sed [选项参数] [模式匹配/sed程序命令] [文件名]

# 模式匹配,sed会读取每一行数据到模式空间中, 之后判断当前行是否符合模式匹配要求,符合要求就会
# 执行sed程序命令, 否则不会执行sed程序命令;如果不写匹配模式,那么每一行都会执行sex程序命令

选项参数说明

选项参数 功能
-e 直接在指令列模式上进行sed的动作编辑。它告诉sed将下一个参数解释为一个sed指令,只有当命令行上给出多个sed指令时才需要使用-e选项;一行命令语句可以执行多条sed命令
-i 直接对内容进行修改,不加-i时默认只是预览,不会对文件做实际修改
-f 后跟保存了sed指令的文件
-n 取消默认输出,sed默认会输出所有文本内容,使用-n参数后只显示处理过的行
-r ruguler 使用扩展正则表达式,默认情况sed只识别基本正则表达式 *

sed程序命令功能描述

命令 功能描述
a add新增,a的后面可以接字串,在下一行出现
c change更改, 更改匹配行的内容
d delete删除, 删除匹配的内容
i insert插入, 向匹配行前插入内容
p print打印, 打印出匹配的内容,通常与-n选项和用
s substitute替换, 替换掉匹配的内容
= 用来打印被匹配的行的行号
n 读取下一行,遇到n时会自动跳入下一行

特殊符号

命令 功能描述
! 就像一个sed命令,放在限制条件后面, 对指定行以外的所有行应用命令(取反)
{sed命令1;sed命令2} 多个命令操作同一个的行

awk

awk是一个强大的文本分析工具,awk在其对数据分析并生成报告时,显得尤为强大简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理, 因为切开的部分使用awk可以定义变量,运算符, 使用流程控制语句进行深度加工与分析。

创始人 Alfred V. Aho、Peter J. Weinberger和Brian W. Kernighan awk由来是姓氏的首字母

语法

1
awk [options] 'pattern{action}' {filenames}

pattern:表示AWK在数据中查找的内容,就是匹配模式

action:在找到匹配内容时所执行的一系列命令

选项参数说明

选项参数 功能
-F 指定输入文件拆分分隔符
-v 赋值一个用户定义变量

awk内置变量

内置变量 含义
ARGC 命令行参数个数
ARGV 命令行参数排列
ENVIRON 支持队列中系统环境变量的使用
FILENAME awk浏览的文件名
FNR 浏览文件的记录数
FS 设置输入域分隔符,等价于命令行 -F选项
NF 浏览记录的域的个数, 根据分隔符分割后的列数
NR 已读的记录数, 也是行号
OFS 输出域分隔符
ORS 输出记录分隔符
RS 控制记录分隔符
$n $0变量是指整条记录。$1表示当前行的第一个域,$2表示当前行的第二个域,……以此类推。
$NF $NF是number finally,表示最后一列的信息,跟变量NF是有区别的,变量NF统计的是每行列的总数

sort

对字符串升序或降序排序

对数字升序或降序

对多列进行排序

介绍

sort命令是在Linux里非常有用,它将文件进行排序,并将排序结果标准输出或重定向输出到指定文件。

语法

1
sort (options) 参数 要排序的对象
选项 说明
==-n== number,依照数值的大小排序
==-r== reverse, 以相反的顺序来排序
==-t 分隔字符== 设置排序时所用的分隔字符, 默认空格是分隔符
==-k== 指定需要排序的列
-d 排序时,处理英文字母、数字及空格字符外,忽略其他的字符。
-f 排序时,将小写字母视为大写字母
-b 忽略每行前面开始出的空格字符
==-o 输出文件== 将排序后的结果存入指定的文件
-u 意味着是唯一的(unique),输出的结果是去完重了的
-m 将几个排序好的文件进行合并

小结

能够使用sort对字符串升序或降序排序

字符串升序: sort -kstart,end 文件

字符串降序: sort -kstartr,end 文件

能够使用sort 对数字升序或降序

数字升序: sort -kstartn,end 文件

数字降序: sort -kstartnr,end 文件

能够使用sort 对多列进行排序

sort -kstart[nr],end -kstart[nr],end ... 文件

参考资料

http://linuxcommand.org/index.php

https://billie66.gitbooks.io/tlcl-cn/content/

https://www.gnu.org/software/bash/manual/bash.html


Shell文本处理
http://www.keker.top/2018/09/25/Linux/shell文本处理/
作者
Keker
发布于
2018年9月25日
许可协议