linux文本工具总结,Linux文本处理工具总结

文本处理工具

grep

作用:行过滤

用法: grep [选项] '关键字' 文件名

常用选项:

-a: 以文本文件方式搜索

-o: 只显示匹配PATTERN 部分的行

-c: 计算匹配规则的行的次数

-i: 条件忽略大小写

-B NUM:打印文本及其前面NUM 行

-A NUM:打印文本及其后面NUM 行

-C NUM:打印文本及其前NUM 行和后NUM行

-n:输出时带行号

-v:输出选中不匹配的行

-w:仅输出完全匹配字词的行

-E:关键词为扩展正则表达式

cut

作用:列截取

用法: cut [选项] 文件

常用选项:

-c [列表]:只选中指定的这些字符

#-d和-f要一起使用

-d '分隔符' -f num:指定分界符代替制表符作为区域分界,保留第num个

sort

作用:文件排序

用法:sort [选项] 文件

常用选项:

-u:配合-c,严格校验排序;不配合-c,则只输出一次排序结果,即unique

-c:检查输入是否已排序,若已有序则不进行操作

-n:使用纯数字进行排序(默认按文字形态排序)

-r:降序(默认升序排序)

-t '分隔符' -k num:使用指定的分隔符替代默认分隔符tab,按第num个进行排序

uniq

作用:文件相邻的重复行仅输出一次

用法:uniq [选项] 文件

常用选项:

-i:忽略大小写

-c:显示该行重复次数

-d:仅显示重复的行

tee

作用:读取标准输入写入标准输入和文件,默认覆盖

用法 tee [选项] 文件

常用选项:

-a:内容追加到给定的文件而非覆盖

diff

作用:逐行比较文件不同,描述怎么改变第一个文件变为第二个文件

用法:

diff [选项] 文件1 文件2

diff [选项] 目录1 目录2

常用选项:

-b:忽略由空格数不同造成的差异

-B:忽略任何因空行而造成的差异

-c:显示全部内文,并标出不同之处

-u:以合并的方式来显示文件内容的不同

-q:只有在文件不同时报告

-N:在比较目录时,若文件A仅出现在某个目录中,预设会显示:Only in目录:文件A,若使用-N参数,则diff会将文件A与一个空白的文件比较

paste

作用:合并文件,默认制表符分割

用法:paste [选项] 文件1 文件2

常用选项:

-d:改用指定的字符替代制表分隔符

-s:串列进行而非平行处理

tr

作用:对文件字符进行替换或删除

用法:

tr '字符串1' '字符串2' < 文件 (字符替换)

tr [选项] '字符串' < 文件 (字符删除)

常用选项:

-d:删除

-s:缩减连续重复的字符成指定的单个字符

sed

作用:流处理,行处理,结果输出屏幕,默认不改变源文件

用法:sed [选项] '处理动作' 文件

常用选项:

-e:以指定的脚本来处理输入的文本文件,多指令编辑

-n:取消默认的完整输出,只要需要的

-r:不需要转义

-i:修改文件内容

-f:以指定的脚本文件来处理输入的文本文件

常用处理动作:

p:打印,通常与-n选项配合使用

i:插入到上一行

a:新增到下一行

c:替换,配合字符串使用

d:删除

s:替代,通常配合正则表达式使用

g:全局替换

= :打印当前行号

注:正则表达式需要用//包裹住

例子:

打印1-5行:sed -n '1,5p' 文件

打印第一行和最后一行: sed -n '1p;$p' 文件

替换匹配内容的行:sed '/正则/c 替换字符串' 文件

搜索全局替换:sed -n 's/搜索内容/替换内容/g' 文件

查找匹配内容行在行首添加字符串:sed '/搜索内容/s/^/&字符串'(^表示起始,&表示添加)

查找匹配内容结尾的行并在行尾添加字符串:sed 's/搜索内容$/&字符串/g'

注:替换内容有斜杠的话要对斜杠进行转义

打印行号:sed -ne '/root/p' -ne '/root/=' 文件

awk

语法:

命令行:awk [选项] '匹配模式+{命令}' 文件

shell脚本:awk -f 脚本 文件

注:

1)匹配模式和命令之间使用;分割可实现匹配多个模式和执行多个命令

2)正则表达式需要用//括住

常用选项:

-f:从脚本中读取awk命令

-v:设定变量

-F:设定分隔符(默认分隔符为空格)

常用命令:

print:打印输出(默认命令)

结合正则:

!:不匹配

~:匹配

常用内建变量:

$n:当前记录的第n个字段,字段间由FS分隔

$0:完整的输入记录

FS:字段分隔符(默认是任何空格)

RS:记录分隔符(默认是一个换行符)

OFS:输出记录分隔符(输出换行符),输出时用指定的符号代替换行符

ORS:输出记录分隔符(默认值是一个换行符)

NF:一条记录的字段的数目

NR:已经读出的记录数,就是行号,从1开始

其余内建变量:

ARGC:命令行参数的数目

ARGIND:命令行中当前文件的位置(从0开始算)

ARGV:包含命令行参数的数组

CONVFMT:数字转换格式(默认值为%.6g)

ENVIRON:环境变量关联数组

ERRNO:最后一个系统错误的描述

FIELDWIDTHS:字段宽度列表(用空格键分隔)

FILENAME:当前文件名

FNR:各文件分别计数的行号

IGNORECASE:如果为真,则进行忽略大小写的匹配

OFMT:数字的输出格式(默认值是%.6g)

RLENGTH:由match函数所匹配的字符串的长度

RSTART:由match函数所匹配的字符串的第一个位置

SUBSEP:数组下标分隔符(默认值是/034)

#命令行处理文件

变量作为参数使用:awk -v NUM=3 -F: '{print $NUM}'文件

打印1-5行或者以root开头的内容:awk 'NR==1,NR==5;/^root/{print $0}' 文件

打印1和5行或者以root开头的内容:awk 'NR==1||NR==5;/^root/{print $0}' 文件

打印指定列:awk -F: '{print $1,$NF}' 文件

打印30-39行且以bash结尾:

awk 'NR>=30 && NR<=39 && /bash$/{print $0}' 文件

awk 'NR>=30 && NR<=39 && $0 ~ /bash$/{print $0}' 文件

计算第一列的总和:cat 文件|awk '{sum+=$1}END{print sum}'

只输出奇数行内容:awk -F : 'NR%2 == 0 {next} {print NR,$1}' 文件

#关联数组(key:value)

统计单词出现个数awk -F: '{shells[$NF]++};END{for (i in shells) {print i,shells[i]}}' 文件

格式化输出(%s输出字符串,-12表示12个字符长度):awk -F : '{printf "% -12s % -6s %-8s\n",$1,$2,$NF}' 文件

#多文件处理

一、两文件(按文件排列顺序依次读入)

FNR:读入文件的记录数

示例:

把a文件中的第二列内容替换为b文件的第二列内容:awk 'BEGIN{OFS=FS=":"} NR==FNR{arr[$1]=$2}NR>FNR{$2=a[$1]}' 文件a 文件b

解释:当读入文件a的时候,已读入文件a的记录数FNR一定等于awk已读入的总记录数NR,因为文件a为awk读入的第一个文件,故执行第一段代码段;而当读入文件b的时候,已读入的总记录数NR一定大于读入文件b的记录数FNR,故执行第二段代码段

二、多个文件

ARGIND:当前被处理的参数标志

ARGV:命令行参数数组

用法1):awk 'ARGIND==1{代码段1}ARGIND==2{代码段2}ARGIND==3{代码段3}' 文件a 文件b 文件c

用法2):awk 'FILENAME==ARGV[1]{代码段1}FILENAME==ARGV[2]{代码段2}FILENAME==ARGV[3]{代码段3}' 文件a 文件b 文件c

用法3):awk 'FILENAME=="文件a"{代码段1}FILENAME=="文件b"{代码段2}FILENAME=="文件c"{代码段3}' 文件a 文件b 文件c

#脚本编程

#BEGIN:程序开始前执行内容

#END:文件处理完执行内容

计算1-10偶数:

for ((i=1;i<=10;i+=2));do echo $i;done|awk '{sum+=$0};END{print sum}'

awk 'BEGIN{ sum;for(i=1;i<=10;i++2) sum=sum+i;{print sum}}'

awk 'BEGIN { i=1;sum=0;while(i<=10) {sum+=i;i++;};{print sum}}'

#案例

统计网站访问状态

ss -antp|grep 80|awk '{states[$1]++};END{for (i in states){print i,states[i]}}'

统计网站每个IP数量

netstat -ant|grep :80|awk -F: '{ip_count[$8]++};END{for (i in ip_count){print i,ip_count[i]}'

ss -an|grep :80|awk -F":" '!/LISTEN/{ip_count[$(NF-1)]++} END{for (i in ip_count) {print i,ip_count[i]}}'

统计网站日志的PV量(浏览量,用户打开一个页面算一次PV)

grep '日期' 文件 |awk '{ips[$1]++};END{for (i in ips) {print i,ips[i]}}'

统计网站日志早上8点到中午12点的总请求量

awk '/2019:08:00/,/2019:12:00/' access.log

正则表达式

第一类正则

.:匹配任意多个字符

*:前导字符出现0或多次

.*:任意长度字符

[]:匹配括号中任意字符

[^]:匹配不包含括号中字符

^[]:匹配以括号中任意字符开头的字符

^[^]:匹配不包含括号中字符开头的字符

\

xxx\>:匹配以xxx作为单词的结尾(\转义符)

\:精准匹配xxx(\转义符)

x\{n\}:前导字符x连续出现n次(\转义符)

x\{n,m\}:前导字符x至少出现n至m次

\(xx\):保存被匹配的字符,调用(&):\1,\2

\d:匹配数字

\s:匹配空格制表符换页符

\w:匹配字母数字下划线

第二类正则

[:alnum:]:字母和数字字符

[:alpha:]:字母

[:digit:]:数字字符

[[:alnum:]]?:0-1个

[[:punct:]]:标点符号

扩展正则(不需要转义字符)

+:匹配一个或多个前导字符

?:匹配0/1个前导字符

|:或

():匹配其中一个元素或作为整体匹配

{n,m}:前导字符重复至少n至m次

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值