linux三大剑客

awk是一种很棒的语言,适合文本处理和报表生成。

使用方法

awk ‘{pattern + action}’ {filenames}
尽管操作可能会很复杂,但是语法总是这样,其中pattern表示AWK再数据中查找的内容,而action是再找到匹配内容时所执行的一系列命令,包括({})不需要再程序中始终出现,pattern就是要表示的正则表达式,用斜杠括起来。action可以有很多的语句,用;号隔开。

参数

-F参数:指定分隔符,可指定一个或多个
-f:从脚本文件中读取awk命令
-mf nnn and -mr nnn:对nnn值设置内在限制,-mf选项限制分配给nnn的最大块数目,-mr限制记录最大数目。
-W:详情参考https://www.runoob.com/linux/linux-comm-awk.html
BEGIN和END模块
通常来说,对于每个输入行,awk都会执行每个脚本代码块一次,然而,再许多编程情况中,可能需要再awk开始处理输入文件中的文本之前执行初始化代码。对于这种情况,awk允许您定义一个BEGIN块。
awk开始处理输入文件之前都会执行BEGIN块,因此它是初始化FS(字段分隔符)变量,打印页眉或初始化其他再程序中以后会引用的全局变量的极佳位置
awk还提供了END块,再处理输入文件中的所有行之后执行这个块,通常用于执行最终计算或者打印应该出现再输出流结尾的摘要信息。

awk运算符

awk包含了赋值运算符,逻辑运算符||、&&。正则运算符、!。关系运算符,算数运算符,
其他运算符
$:字段引用
空格:字符串链接符
?: :三目运算符
ln:数组中是否存在某键值

常用的awk内置变量

$0:当前记录
1   1~ 1 n:当前记录的第n个字段
FS:输入字段分隔符,默认是空格
RS:输入记录分隔符,默认是换行符
NF:当前记录中的字符个数,就是有多少列
NR:已经读出的记录数,就是行号,从1开始
OFS:输出字段分隔符,默认也是空格
ORS:输出的记录分隔符,默认为换行符

  1. 字段分隔符FS
    FS="\t"一个或者多个Tab分割
    NF:字段数量,比如’NF8{print $0}’
    NR:记录数量,比如’NR
    2{print $4}’
    RS:记录分隔符变量,
    OFS:设置输出结果$1, 2... 2... 2...n之间的分隔符。
    ORS:输出记录分隔符设置,就是输出结果行与行之间的分割符
awk正则

:行首定位符(root)匹配所有root开头的行
: 行 位 定 位 符 ( r o o t :行位定位符(root root)匹配所有root结尾的行
.:匹配任意单个字符
*:匹配0
?:匹配0个或者1个前导字符
[]:匹配自定字符组内的任意一个字符/1,匹配以字符a或b或c开头的行
[]:匹配不再指定字符组内任意一个字符。/[^abc],匹配不以a,b,b开头的行
():子表达式组合。/(rool)+/表达一个或者多个rool组合,当有一些字符需要组合时,使用括号括起来
|:或者的意思。/(root)|B/匹配root或者B的行
\:转移字符。/a///匹配a//
,!:匹配、不匹配的条件语句。$1~/root/匹配第一个字段包含字符root的所有记录。
x{m}:x重复了m次
x{m,}:x重复至少m次
x{m,n}:x重复至少m次,但是不超过n次

uniq命令

uniq一般和sort一起使用,用来对排序好的内容去重

命令格式

uniq [-cdu][-f<栏位>][-s<字符位置>][–help][–version][输入文件]【输出文件】
参数:
-c或者–count 在每列旁边显示该行重复出现的次数
-d或–repeated 仅显示重复出现的行
-f<栏位>或–skip-fields=<栏位> 比较时跳过前n列,从n+1开始比较
-s<字符位置>或–skip-chars=<字符位置>比较时跳过前n个字符,从n+1个字符开始比较
-u或–unique 仅显示出现一次的行
-w<字符位置>或–check-chars=<字符位置>对每行第n个字符之后的内容不作对照

  1. 默认去重
    sort -k 2,2 file_name | uniq:去掉所有重复的项
  2. 比较时跳过前n列,从n+1列开始比较(注意是列跳过)
    sort -k 2,2 filename | uniq -f 3(跳过前3列)
  3. 对每行第n个字符以后的内容不作对照,忽略n以后的字符
    sort -k 2,2 filename | uniq -w 1(第一个字符之后不作比较)
  4. 跳过前n个字符,从n+1开始比较(和3相反)
    sort -k 2,2 filename | uniq -s l
  5. 在每列旁边显示该行重复出现的次数,并仅显示出现一次的行
    sort -k 2,2 filename | uniq -c -u(仅仅显示出现一次的行)
  6. 在每列旁边显示该行重复出现的次数,并仅显示重复出现的行
    sort -k 2,2 file_name | uniq -d -c(仅仅显示重复的行以及次数)

sort命令

sort用来进行对文件中的每一行作为一个单元,相互比较进行排序(排序原则为ASCII码)
参数讲解
-u:sort -u filename:输出行去除重复行。只识别-k指定的域
-r:默认排序方式时升序,-r就是降序
-n:按照数字来及逆行排序
-o:sort默认输出到标准输出,使用重定向才能写到文件,但是写入源文件就不行了。-o就是将结果写入到一个新文件,当文件名相同时,这时候就时将新的结果写入到新文件
-k:指定的列(指定的列一般搭配着-t来进行时核定间隔符)
-t:设置间隔符。后面跟间隔符
-f:将小写字母转换为大写字母来进行比较(忽略大小写)
-c:检查文件是否已经排好序了,如果乱序,输出第一个乱序的
-C:检查文件是否已排好序,如果乱序,不输出内容,返回1
-M:会以月份排序,比如JAN小于FEB
-b:会忽略每一行前面的所有空白部分,从第一个可见字符开始比较

对-k参数的详解

-k是排序的时候对排序列表的选择。
问题1:当遇到多个排序关键字怎么办?
-k1 -k2 -k3 -k4都是可以的
sort -t ’ ’ -k2rn -k3n filename
对空格进行分割列表,第二列进行rn(倒序、数字)排序,对第三列进行n(数字)排序
-k的具体语法格式。
[FStart[.CStart]][Modifier][,[FEnd[.CEnd]][Modifier]]
这个语法格式可以被其中的逗号“,”分为两个部分,Start部分和End部分。
Start部分也由三个部分组成,其中的Modifier部分就是我们之前说的类似n和r选项部分。
CStart也是可以省略的,省略的话就表示从本域的开头部分开始。之前的例子中的-k2和-k3就是省略了CStart…(太多了不易懂,直接举例子)
对列的第几个字符开始比较
sort -t ’ ’ -k1.2 filename:对分列之后第一列第二个字符开始排序
sort -t ’ ’ -k1.2,1.2 filename:对特定的位置1.2的位置作为排序关键字


  1. abc ↩︎

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值