Linux awk、sort、uniq命令

Linux awk命令
语法
awk [选项参数] 'script' var=value file(s)

awk [选项参数] -f scriptfile var=value file(s)

选项参数说明:

-F fs or --field-separator fs 指定输入文件折分隔符,fs是一个字符串或者是一个正则表达式,如-F:。
-v var=value or --asign var=value 赋值一个用户定义变量。
-f scripfile or --file scriptfile 从脚本文件中读取awk命令。


$n : 当前记录的第n个字段,比如n为1表示第一个字段,n为2表示第二个字段。
$0 : 这个变量包含执行过程中当前行的文本内容。

每行按空格或TAB分割,输出文本中的1、4项
awk '{print $1,$4}' log.txt

使用","分割
awk -F, '{print $1,$2}' log.txt

使用多个分隔符.先使用空格分割,然后对分割结果再使用","分割
awk -F '[ ,]' '{print $1,$2,$5}' log.txt

awk -v # 设置变量
awk -va=1 '{print $1,$1+a}' log.txt

awk -f {awk脚本} {文件名}
awk -f cal.awk log.txt

过滤第一列大于2的行
awk '$1>2' log.txt

过滤第一列等于2的行
awk '$1==2 {print $1,$3}' log.txt

过滤第一列大于2并且第二列等于'Are'的行
awk '$1>2 && $2=="Are" {print $1,$2,$3}' log.txt

输出第二列包含 "th",并打印第二列与第四列
awk '$2 ~ /th/ {print $2,$4}' log.txt

输出包含"re" 的行
awk '/re/ ' log.txt

忽略大小写
awk 'BEGIN{IGNORECASE=1} /this/' log.txt

计算文件大小
ls -l *.txt | awk '{sum+=$5} END {print sum}'

从文件中找出长度大于80的行
awk 'length>80' log.txt

打印九九乘法表
seq 9 | sed 'H;g' | awk -v RS='' '{for(i=1;i<=NF;i++)printf("%dx%d=%d%s", i, NR, i*NR, i==NR?"\n":"\t")}'


Linux sort命令
语法
sort [-bcdfimMnr][-o<输出文件>][-t<分隔字符>][+<起始栏位>-<结束栏位>][--help][--verison][文件]

参数说明:
-b 忽略每行前面开始处的空格字符。
-c 检查文件是否已经按照顺序排序。
-d 排序时,处理英文字母、数字及空格字符外,忽略其他的字符。
-f 排序时,将小写字母视为大写字母。
-i 排序时,除了040至176之间的ASCII字符外,忽略其他的字符。
-k 以哪一列进行排序
-m 将几个排序好的文件进行合并。
-M 将前面3个字母依照月份的缩写进行排序。
-n 依照数值的大小排序。
-o<输出文件> 将排序后的结果存入指定的文件。
-r 以相反的顺序来排序。
-t<分隔字符> 指定排序时所用的栏位分隔字符。
-u 去除重复行


对文件的行进行排序:
sort /etc/passwd

以 : 作为分隔符,以第3列按照数值大小进行排序:
sort -t : -nk 3 /etc/passwd

以 : 作为分隔符,分别按第4列、第3列按照数值大小进行排序:
sort -t: -nk 4 -nk 3 /etc/passwd

以 : 作为分隔符,以第4列按照数值大小进行排序,然后针对排序的列去重(sort|uniq是针对行去重,两者有区别):
sort -t: -nk 4 -u /etc/passwd


Linux uniq命令
语法
uniq [-cdu][-f<列数>][-s<字符位置>][文件]

参数说明:
-c 在每行前面显示该行重复的次数。
-d 仅显示重复的行列。
-u 仅没有重复的行列。
-f<N> 忽略前N列进行去重。
-s<字符位置> 忽略比较指定的字符。

例:
cat test.txt
2 b
5 e
3 c
1 a
4 d
1 a
2 b
2 a
1 b

排序并显示重复行次数:
[root@vm-centos7 ~]# sort test.txt|uniq -c
2 1 a
1 1 b
1 2 a
2 2 b
1 3 c
1 4 d
1 5 e
[root@vm-centos7 ~]#

忽略前1列,从第二列开始去重
[root@vm-centos7 ~]# sort -k 2 test.txt|uniq -f 1
1 a
1 b
3 c
4 d
5 e
[root@vm-centos7 ~]#

提示:uniq只会检查相邻的行,因此要去重必须先排序。

猜你喜欢

转载自www.cnblogs.com/pccnng/p/10622056.html