grep
作用:文本搜索工具,根据用户指定的“模式(过滤条件)”对目标文本逐行进行匹配检查, 打印匹配到的行。
模式:由正则表达式的 “元字符” 及 “文本字符” 所编写的 “过滤条件”
语法:
grep [options] [pattern] file
命令 参数 匹配模式 文本数据
参数选项 | 解释说明 |
-v | 排除匹配结果 |
-n | 显示匹配行和行号 |
-i | ignorecase 忽略大小写 |
-c | 只统计匹配的行数 |
-E | 使用egrep命令 egrep 即grep -E |
--color=auto | 为grep过滤结果添加颜色 #我觉着可以在.cshrc 里面起个别名 # alias grep “grep --colorauto” |
-w | 只匹配过滤的单词 |
-o | 只输出匹配的内容 |
-q, --quiet, --slient | 静默模式,即不输出任何信息 |
sed
语法:
sed [参数选项] [sed 内置命令字符] [输入文件]
参数选项:
-n :取消默认sed的输出,常与sed内置命令p一起使用 。只会打印符合规则的输出。不使用-n,会把所有的都输出
-i :直接将修改结果写入文件,不用 -i, sed修改的是内存数据
-e :多次编辑,不需要管道符了
-r :支持正则扩展
内置命令字符:
a :append, 对文本追加,在指定行后面添加行或多行文本和 i 命令相反
d :Delete,删除匹配行
i :insert,表示插入文本,在指定行前面添加一行或多行文本
p : Print,打印匹配行的内容,通常p和-n一起使用
s/正则/替换内容/g :匹配正则内容,然后替换内容(支持正则),结尾g代表全局匹配,也可以写作 s#正则#替换内容#g s@正则@替换内容@g
sed 匹配范围:
范围 | 解释 |
空地址 | 全文处理 |
单地址 | 指定文件某一行 |
/pattern/ | 被模式匹配到的每一行 |
范围区间 | 10,20 十到二十, 10,+5 第10行向下5行,包括第十行到第15行 /pattern1/pattern2/ |
步长 | 1~2 表示从第一行开始,跨两个步长,1、3、5、7、9、奇数行 2~2 表示从第二行开始,跨两个步长,2、4、6、8、10、偶数行 |
例子:
sed -n “2,3p” aaa.txt #输出文件第2行3行内容, -n 取消默认输出。 p 打印
sed -n “2,+3p” aaa.txt #输出第2, 3,4,5行内容
sed -n “/linux/p” aaa.txt #输出匹配到linux的行
sed “/game/d” aaa.txt #删除模式空间(即内存)中含有game 的行
sed -i “/game/d” aaa.txt #删除含有game 的行,并直接写入文件
sed -i “5,$d” aaa.txt #删除第5行到结尾行,并直接写入文件中
sed -i “s/My/You/g” aaa.txt #把文件中所有的My 替换成You,写回到文件中
sed -i -e “s/You/My/g” -e “s/38383/1000/g” aaa.txt #把You换成My,把38383换成1000,并写回到文件中
sed -i “2a My name is Tim” aaa.txt #在第二行后面追加一行 My name is Tim
sed -i “2i My name is Tim” aaa.txt #在第二行前面插入一行
sed -i “3a I love you \n I like you” aaa.txt #在第三行后面追加一行。并写回文件。但由于# \n 的存在实际是追加了两行
sed -i “a ####” aaa.txt #由于a 后面没有跟数字,也就是指匹配范围的“空地址”
#指代全局,会在每一行后面追加 ####
awk
awk语法
awk [option] ‘pattern[action]’ file …
参数 ‘条件动作’ 文件
Note:action值得是动作,awk擅长文本格式化,且输出格式化后的结果,因此最常用的动作就是print和printf
awk应用场景
awk默认以空格为分隔符,且多个空格也识别为一个空格,作为分隔符。
awk是按行处理文件,一行处理完毕,处理下一行,根据用户指定的分隔符去工作,没有指定则默认空格。
制定了分隔符后,awk把每一行切割后的数据对应到内置变量
$0:代表一整行。
$1 :代表第一列
$2 :代表第二列
$NF :代表当前分割后的最后一列,倒数第二列可以写成$(NF-1)
awk的部分内置变量
$n : 指定分隔符后,当前记录的第n个字段。n代表数字
$0 : 完整的输入记录
FS : 字段分隔符,默认是空格,也叫作输入分隔符
OFS : 输出分割符
RS : 输入记录分隔符(输入换行符),指定输入时的换行符
ORS :输出记录分隔符(输出换行符),输出是指定符号代替换行符
NF(Number of fields) : 分割后,当前一共有多少个字段。每一行被切割成几段数目
NR(Number of records) : 当前记录数,行数,表示行号
FNR :各个文件分别计数的行号
FILENAME :当前文件名
ARGC :
ARGV : 表示一个数组,数组中保存的是命令行所给的参数。条件动作不在ARGV中
awk参数:
-F :指定分隔符
-v : 定义或修改一个awk内部的变量
-f :从脚本文件中读取awk命令
例子:
awk ‘{print $1$4$5}’ aaa.txt #打印1、4、5列信息。但各个信息之间没有分隔符
awk ‘{print $1,$4,$5}’ aaa.txt #打印1、4、5列信息。各个信息之间以默认分隔符空格
#进行分割
自定义输出
awk必须外层单引号,内层双引号
例子
Awk ‘{print “第一列:”$1,“第二列:” $2}’ aaa.txt #打印第一列,第二列内容,并在
#各自前面加上自定义的信息
awk ‘{print}’ aaa.txt #输出每一行信息
awk ‘{print $0}’ aaa.txt #输出每一行信息
awk 'NR==5{print $0}' aaa.txt #print $0 打印每一行信息,NR==5,只取第5行。
awk 'NR==5, NR==6{print $0}' aaa.txt #打印第5行,第6行
awk 'NR==3, NR==6' aaa.txt #输出第3行到第6行全部内容
awk '{print NR, $0}' aaa.txt #打印每一行,并打印出行号
awk 'NR==37,NR==40{print NR, $0}' aaa.txt #打印出37~40行的内容,并加上行号
awk '{print $1, $(NF-1)}' aaa.txt #打印出第一列和底数第二列
#输入分隔符(FS)和输出分隔符(OFS)
awk -F ":" '{print $1,$NF}' aaat.txt #以冒号为分隔符打印第一列和最后一列
awk -v FS=":" '{print $1,$NF}' aaat.txt #以冒号为分隔符打印第一列和最后一列,注意 -v的#作用是把变量FS的值改变了
awk -F ":" -v OFS=“------” '{print $1,$NF}' aaat.txt #打印第一列和第二列,读入数据时
#以冒号分割,打印到屏幕上时以
# ------ 分割
awk 'BEGIN{print "开始使用awk"} {print $0}' aaa.txt #在执行动作之前先先打印一些信息
awk -v myname="TIM" 'BEGIN{print "我的名字是",myname} #使用-v 定义变量,
#并传递变量
awk -v awk_name=$myname 'BEGIN{print awk_name}' #获取shell 变量 $myname
awk中printf和print的区别
format的使用
要点:
- printf需要指定format
- format用于指定后面每个item的输出格式
- printf语句不会自动打印换行符
format格式的指示符都以%开头,后跟一个字符:如下:
%c :显示字符的ASCII码
%d,%i :十进制整数
%e,%E:科学计数法显示数值
%f :浮点数
%g,%G : 以科学计数法的格式或浮点数的格式显示数值
%s : 字符串
%u : 无符号整数
%% : 显示%自身
printf 修饰符
- : 左对齐,默认右对齐
+ : 显示数值符号
printf动作默认不会添加换行符
print默认添加空格换行符
awk模式pattern
BEGIN模式是处理文本之前需要执行的操作
END模式处理文本之后需要执行的操作