文本处理工具

文本处理小工具

tr

tr [选项]…SET1 [SET2]

从标准输入中替换、缩减和/或删除字符,并将结果写到标准输出。

​ -c:取字符集的补集

​ -d:删除所有属于第一字符集的字符

​ -s:把连续重复的字符以单独一个字符表示(压缩)

​ -t:将第一个字符集对应字符转化为第二字符集对应的字符

cut

cut – 在文件的每一行中提取片断

在每个文件 FILE 的各行中, 把提取的片断显示在标准输出.

​ -d:指定分割符

​ -f:指定打印的段落

sort

串联排序所有指定文件并将结果写到标准输出。

​ -n:按大小进行排序 -r:倒序 -k:按那一个字段进行排序 sort -t: -k3 -n /etc/passwd #按照第三列数字大小正序排列 sort -t: -k3 -nr /etc/passwd #按照第三列数字大小逆序排列 seq 102 |sort -R |head -n1 cut -d: -f1,3 /etc/passwd |sort -t: -k2 -nr

uniq

从输入文件或者标准输入中筛选相邻的匹配行并写入到输出文件或标准输出。

​ -c:统计重复个数,并打印重复个数

​ diff:文件不同点对比

​ patch:给文件打补丁 patch -p1 FILE1 < FILE2 //使用FILE1给FILE2进行打补丁

 

Linux文本处理三剑客

grep

grep的工作方式,它在一个或多个文件中搜索字符串模板。如果模板包括空格,则必须被引用,模板后的所有字符串被看作文件名。搜索的结果被送到屏幕,不影响原文件内容。

-E:使用扩展正则表达式 -R:不使用正则表达式 -v:显示不被pattern匹配到的行 -o:仅显示匹配到的字符串 -i:忽略大小写 -n:显示匹配的行号 -c: 统计匹配的行数 -A n:打印匹配行的后几行 -B n:打印匹配行的前几行 -C n:打印匹配行的前后几行

-w:匹配整个单词

-xz:匹配整行

sed

行编辑器,流处理器

sed之所以能以行为单位的编辑或修改文本,其原因在于它使用了两个空间:一个是活动的“模式空间(pattern space)”,另一个是起辅助作用的“保持空间(hold space)这2个空间的使用。

模式空间:可以想成工程里面的流水线,数据之间在它上面进行处理。 保持空间:可以想象成仓库,我们在进行数据处理的时候,作为数据的暂存区域。

正常情况下,如果不显示使用某些高级命令,保持空间不会使用到!

sed在正常情况下,将处理的行读入模式空间,脚本中的“sed command(sed命令)”就一条接着一条进行处理,直到脚本执行完毕。然后该行被输出,模式被清空;接着,在重复执行刚才的动作,文件中的新的一行被读入,直到文件处理完毕。

sed语法:sed [option]…’script’ inputfile…. sed常用选项 -n:不输出模式空间内容到屏幕,即不自动打印 -i.bak //备份原有文件FILE.bak -r:支持使用扩展正则表达式 -e:多点编辑 -f:/PATH/SCRIPT_FILE 从指定文件中读取编辑脚本 sed的编辑命令 d:删除指定行 p:打印模式空间的内容 a []text:在指定行之后追加文本,可以使用/n进行换行 sed ‘2,5a\ ===’ f1 #在第二行到第五行之后插入空格加等号 i []text:在指定的之前添加文本 sed -i.bak ‘/aliases/aalias p=poweroff’ .bashrc sed -i.bak ‘/aliases/aalias cdnet=”cd /etc/sysconfig/network-scrts/”‘ .bashrc c []text:替换指定行 w /PATH/SOMEFILE:将匹配的行保存在指定文件 r /PATH/SOMFILE:读取指定的文件到模式空间中的指定位置 =:为模式空间匹配的行打印行号 ! :模式空间中匹配行取反处理

​ s///:查找替换,指出使用其它分隔符,s@@@,s### g:全局替换 p:打印 w /PATH/TO/SOMEFILE:将替换成功的行保存在指定文件中

​ 高级编辑命令

​ P:打印模式空间开端至\n内容,并追加到默认输出之前 g:[address[,address]]g 将hold space中的内容拷贝到pattern space中,原来pattern space里的内容清除。

​ G:[address[,address]]G 将hold space中的内容append到pattern space\n后。 h:[address[,address]]h 将pattern space中的内容拷贝到hold space中,原来的hold space里的内容被清除。 H:[address[,address]]H 将pattern space中的内容append到hold space\n后。 d:[address[,address]]d 删除pattern中的所有行,并读入下一新行到pattern中。 D:[address[,address]]D 如果模式空间包含换行符,则删除直到第一个换行符的模式空间中的文本,并不会读取新的输入行,而使用合成的模式空间重新启动循环。如果模式空间不包含换行符,则会像发出d命令那样启动正常的新循环 x:交换保持空间和模式空间的内容。

awk

awk变量,awk格式化,awk操作符,awk条件判断,awk循环,awk数组,awk函数,调用系统命令

报告生成器,格式化文本输出

awk相较于sed常常作用于整行的处理,awk比较倾向于一行当中分成数个字段来处理。awk相当适合处理小型的数据。在awk语法中行row,也可以称为记录record;列column,也可以称为字段fields、域area、属性Attributes。基本语法: awk [option] ‘program’ var=value file… awk [option] -f progarmfile var=value file… awk [option] ‘BEGIN{action;…}pattern{action;…}END{action;…}’file

program通常是被单引号或双引号中,一般用单引号。默认的字段分隔符为“空格键”或“【tab】键”选项 -F:指明输入时用到的字段分隔符 -v 进入变量模式 可以进行变量的赋值及调用(调用不需要加$符) 基本格式:awk [options]’program’file…program:pattern{action statements;…}pattern和action pattern部分决定动作语句何时触发及触发事件 BEGIN,END action statements对数据进行处理,放在{}内指明 print,printf分隔符、域和记录

awk变量:内置和自定义变量

printf命令

格式化输出:printf “FORMAT”,item1,item2 …

(1)必须指定FORMAT

(2)不会自动换行,需要显示给出换行控制符

(3)FORMAT中需要分别为后面的每个item指定格式符

格式符:

​ %c:显示字符的ASCII码

​ %d,%i:显示十进制数

​ %e,%E显示科学记数法数值

​ %f:显示为浮点数

​ %g,%G:以科学记数法或浮点形式显示数值

​ %s:显示字符串

​ %u:无符号整数

​ %%:显示%自身

修饰符:

printf示例:

​ 操作符

​ 算术操作符:

​ x+y,x-y, x*y, x/y, x^y, x%y

​ -x:转换为负数

​ +x:转换为数值

​ 赋值操作符:

​ =,+=,-=,*=,/=,%=,^ =

​ ++,–

​ 下面两语句有何不同

awk ‘BEGIN{i=0;print ++i,i}’

awk ‘BEGIN{i=0;print i++,i}’

​ 比较操作符:

​ == , != , > , >= , < , <=

​ 模式匹配符:

~左边是否和右边匹配含!~:是否不匹配

​ 逻辑 操作符:与&&,或||,非!

​ 函数调用:

function_name(argu1,argu2,…)

​ 条件表达式(三目表达式)

​ awk PATTERN

​ PATTERN:根据pattern 条件,过滤匹配的行,再做处理

​ (1)如果未指定:空模式,匹配每一行

​ (2)/regular expression/:仅处理能够模式匹配到的行,需要用/ /扩起来

(3)relational expression:关系表达式,结果为“真”才会被处理

​ 真:结果为非0值,非空字符串

​ 假:结果为空字符串或0值

(4)line ranges:行范围

​ startline,endline:/pat1/,/pat2/不支持直接给出数字格式

​ (5)BEGIN/END模式

​ BEGIN/END{}:仅在开始处理文件中的文本之前执行一次

​ END{}:仅在文本处理完成之后执行一次

awk action

常用的action分类

(1)Expressions:算术,比较表达式等

(2)Control statements:if ,while等

(3)compound statements:组合语句

(4)input statements

(5)output statements:print等

awk控制语句if-else

语法: if(condition){statement;…}[else statement]

if(condition1){statement1}else if(condition2){statement2}else{statement3}

使用场景:对awk取得的整行或某个字段做条件判断

awk控制语句

while循环

语法:while(condition){statement;…}

条件“真”,进入循环;条件“假”,退出循环

使用场景:

对一行内的多个字段逐一类似处理时使用

对数组中的各元素逐一处理时使用

do-while循环

语法:do {statement;…}while(condition)

意义:无论真假,至少执行一次循环体

for循环

语法:for(expr1;expr2;expr3){statement;…}

常见用法:

for(variable assignment;condition;iteration process)

{for-body}

特殊用法:能够遍历数组中的元素

语法:for(var in array){for-body}

awk控制语句

switch语句

语法:switch(expression){case VALUE1 or /REGEXP/:statement1;case VALUE2 or /REGEXP2/:statemet2/:statement2;…;default:statement}

break和continue

awk控制语句

break[n]

continue[n]

Next:

提前结束对本行处理而直接进入下一行处理(awk自身循环)

awk数组

关联数组:array[index-expression]

Index-expression:

(1):可使用任意字符串;字符串要使用双括号括起来

(2):如果某数组元素事先不存在,在使用时,awk会自动创建次元素,并将其值初始化为“空串”

若要判断数组中是否存在某元素,要使用“index in array”格式进行遍历

若要遍历数组中的每个元素,要使用for循环

for(var in array){for-body}

注意:var会遍历array的每个索引

awk函数

数值处理:

rand():返回0和1之间一个随机数

Awk ‘BEGIN{srand();for(i=1;i<=10;i++)print int(rand()*100)}’

字符串处理: length([s]):返回指定字符串的长度

sub(r,s,[t]):对t字符串进行搜索r表示的模式匹配的内容,并将第一个匹配的内容替换为s

echo “2008:08:08 08:08:08” |awk ‘sub(/:/, “-,$1”)’

gsub(r,s,[t]):对字符串进行搜索r表示的模式匹配的内容,并全部替换为s所表示的内容

echo “2008:08:08 08:08:08” |awk ‘gsub(/:/, “-“$0)’

split(s,starry,[r]):以r为分隔符,切割字符串s,并将切割后的结果保存至array所表示的数组中,第一个索引值为1,第二个索引值为2,…

awk函数

自定义函数

格式: function name(parameter, parameter,…){

statements

return expression

}

awk中调用shell命令

system命令

空格是awk中的字符串连接符,如果system中需要使用awk中的变量可以使用空格分隔,或者说除了awk的变量外其它一律用“”引用起来。

awk BEGIN'{system(“hostname”)}’

awk ‘BEGIN{score=100;system(“echo your score is” score)}’

awk脚本

将awk程序写成脚本,直接调用或执行

向awk脚本传递参数

格式:

awkfile var=value var2=value2…inputfile

注意:在BEGIN过程中不可用。直到首行输入完成以后,变量才可用。可以通过-v参数,让awk在执行BEGIN之前得到变量的值。命令行只能够每一个指定的变量都需要一个-v参数

统计row中某个字段出现的次数

1、统计本机被访问次数

Awk ‘/^[0-9]/{ip{$1}++}END{for(i in ip){print i ,ip[i]}}’ /var/log/httpd/access_log

2、如果超过访问超过1000次就视为攻击,放入防火墙中

for i in `awk

iptables -A INPUT -s 192.168.30.6 -j REJECT

3、抽取连接本机ip的前十位。

4、统计/etc/rc.sysinit某个文档里面某个单词出现的次数,默认以空格位分隔符

思路:逐行统计,再汇总

5、某班考试成绩表如下:

姓名 性别 成绩
mage male 100
zhangsir male 99
bai female 90
li female 100

根据成绩表,统计男生平均成绩和女生平均成绩

 

本文来自投稿,不代表Linux运维部落立场,如若转载,请注明出处:http://www.178linux.com/98029

联系我们

400-080-6560

在线咨询

工作时间:周一至周五,9:30-18:30,节假日同时也值班

QR code