文本处理工具 —— cut、sort、wc、sed、awk

cut 切割

选项:
-f 选择显示的列
-s 显示有分隔符的行
-d 自定义分隔符

示例

[root@node001 ~]# cat cut.txt 
hello word
2333 so happy
haha
jokd hfa ojf efwa
## 以空白符为切割符,显示第二列数据
[root@node001 ~]# cut -d' ' -f2 cut.txt 
word
so
haha
hfa
## 以空白符为切割符,显示第二列数据,因为原文本第三行没有空白符所以不显示
[root@node001 ~]# cut -d' ' -s -f2 cut.txt 
word
so
hfa

sort 排序

排序大体分为两种,一种是数值序另一种是字典序,sort 默认是按字典序排序。

选项:
-n 按数值排序
-r 倒序
-t 自定义分隔符
-k 选择排序列
-u 合并相同行
-f 忽略大小写

示例

[root@node001 ~]# cat sort.txt
nana 12
apple 1
orange 8
## 选择第一列按字典序进行排序
[root@node001 ~]# sort sort.txt
apple 1
nana 12
orange 8
## 选择第二列按字典序进行排序
[root@node001 ~]# sort -t' ' -k2  sort.txt
apple 1
nana 12
orange 8
## 选择第一列按数值序进行排序
[root@node001 ~]# sort -t' ' -k2 -n  sort.txt
apple 1
orange 8
nana 12

wc 统计

选项:
-l 显示文件行数

示例
统计文件 sort.txt 有几行

[root@node001 ~]# cat sort.txt | wc -l
3

sed 行编辑器

sed 是流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用 sed 命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。默认不修改原文件,如果需要修改需加 -i 参数

语法:
sed [options] ‘AddressCommand’ file

options:
-n 静默模式,不在默认显示模式空间中的内容
-i 直接修改原文件
-e SCRIPT -e SCRIPT … 可以同时执行多个脚本文件,且脚本顺序会影响执行结果
-f script-file 指定一个 sed 脚本文件到命令行执行
-r 表示使用扩展正则表达式

Command:
-d 删除符合条件的行
-P 显示符合条件的行
-a\string 在指定的行后面追加新行,内容为 string
  \n 可以用于换行
-i\string 在指定的行前面插入新行,内容为 string
-rFILE 将指定的文件的内容添加至符合条件的行处
-wFILE 将地址指定的范围内的行另存至指定的文件中
-s/pattern/string/gi 查找并替换,默认替换每行中第一次被模式匹配到的字符串
 g 行内全局替换
 i 忽略大小写

Address:
-可以没有
-可以给定范围($ 表示最后一行)
 例如:2,4 表示2到4行
    2~3 表示第2行、第5行、第8行…
    2,+4 表示2到6行
-也可以查找指定行/str/

示例

[root@node001 ~]# cat sed.txt 
   today is nice day
  you can walk out on the street
    it will be import to you
## 删除每行前面的空白符
[root@node001 ~]# sed 's/^[ ]*//' sed.txt 
today is nice day
you can walk out on the street
it will be import to you
## 给最后一行之前插入 “haha” 和一个换行符
[root@node001 ~]# sed '$i\haha' sed.txt 
   today is nice day
  you can walk out on the street
haha
    it will be import to you

awk

awk 是一个强大的文本分析工具。
相对于 grep 的查找,sed 的编辑,awk 在其对数据分析并生成报告时,显得尤为强大。
简单来说 awk 就是把文件逐行的读入,(空格,制表符)为默认分隔符将每行切片,切开的部分再进行各种分析处理。

语法:
awk -F ‘{pattern + action}’ filenames

支持自定义分隔符 -F(默认为空格符、制表符)
支持正则表达式匹配
支持自定义变量,数组 a[1] a[tom] map(key)

支持内置变量

  • ARGC 命令行参数个数
  • ARGV 命令行参数排列
  • ENVIRON 支持队列中系统环境变量的使用
  • FILENAME awk浏览的文件名
  • FNR 浏览文件的记录数
  • FS 设置输入域分隔符,等价于命令行 -F选项
  • NF 浏览记录的域的个数(显示列数)
  • NR 已读的记录数(显示行数)
  • OFS 输出域分隔符
  • ORS 输出记录分隔符
  • RS 控制记录分隔符

支持函数:
print、split、substr、sub、gsub

支持流程控制语句,类C语言:
if、while、do/while、for、break、continue

示例

[root@node001 ~]# cat awk.txt 
Tom      0   2012-12-11      car     3000
John     1   2013-01-13      bike    1000
vivi     1   2013-01-18      car     2800
Tom      0   2013-01-20      car     2500
John     1   2013-01-28      bike    3500

## 只显示文本的第一列 ($0为整行,$1为第一列......)
[root@node001 ~]# awk '{print $1}' awk.txt 
Tom
John
vivi
Tom
John
[root@node001 ~]# awk '{print $0}' awk.txt 
Tom      0   2012-12-11      car     3000
John     1   2013-01-13      bike    1000
vivi     1   2013-01-18      car     2800
Tom      0   2013-01-20      car     2500
John     1   2013-01-28      bike    3500

## 显示文本的第一列和第五列,而且在第一行之前添加列名 name,salary
## BEGIN{这里面放的是执行前的语句} 
## END{这里面放的是处理完所有的行后要执行的语句} 
[root@node001 ~]# awk 'BEGIN{print "name\tsalary"} {print $1"\t"$5}' awk.txt 
name	salary
Tom     3000
John	1000
vivi	2800
Tom		2500
John	3500

## 统计报表:合计每人1月工资, 0:manager, 1:worker
[root@node001 ~]# cat awk.sh
#! /bin/awk -f
{
# 将第三列按分隔符 “-”切割,并存储在数组date中
split($3,date,"-");
if(date[2] == "01"){
	name[$1] += $5}
	if($2 == 0){
		role[$1]="manager"
	}else{
		role[$1]="worker"
	}
}
END{
	for(i in name){
		print i"\t"role[i]"\t"name[i]
	}
}
[root@node001 ~]# awk -f awk.sh awk.txt 
vivi	worker	2800
Tom		manager	2500
John	worker	4500

## 搜索 /etc/passwd 有 root 关键字的所有行
[root@node001 ~]# awk '/root/ {print $0}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

关于 awk 的详解,可以参考 https://blog.csdn.net/Mr_Bei/article/details/83112860

发布了42 篇原创文章 · 获赞 11 · 访问量 3836

猜你喜欢

转载自blog.csdn.net/weixin_44584387/article/details/88564465