文本数据处理命令

cut命令

cut命令,以行为单位切割行数据,显示切割的行数据

参数:-f选择显示的列,-s不显示没有分隔符的行,-d自定义分隔符

#文件名:regularizationTest #
hello msb
hellowjw
hello angelababy
hello dilireba
iiii250 wyf
hello zhangxinyi
11 hel mhellosbjy lo
###############

# 展示第1列
cut -d ' ' -f1 regularizationTest

# 展示第1-2列
cut -d ' ' -f1,2 regularizationTest

# 展示第1-3列
cut -d ' ' -f1-3 regularizationTest

# 不显示没有分隔符的行
cut -d ' ' -f1-3  -s regularizationTest

sort命令

sort命令,用于对行数据进行排序,参数有:

-n:按数值排序,若没有-n参数则按字典序来排序

-r:倒序

-t:自定义分隔符

-k:选择排序列

-u:合并相同行

-f:忽略大小写

#文本名称 sortTest#
angelababy 9
dilireba 10
zhangxinyi 8
zhangxinyi 8
Angelababy 9
kasha 12
akali 11.5
#################

# 按名字排序(默认是字典序)
sort -t ' ' -k1 sortTest

# 按名字排序,且合并相同的行
sort -t ' ' -k1 -u sortTest
# 按名字排序,且合并相同的行,忽略大小写
sort -t ' ' -k1 -u -f sortTest

# 按颜值排序(数值序)
sort -t ' ' -k2 -n -u -f sortTest
# 倒序
sort -t ' ' -k2 -n -r -u -f sortTest

wc命令

wc命令,统计文本的行数,词数,字节数

wc sortTest
# 结果为:
# 行数 词数 字节数  文件名
# 7    14    84  sortTest

# 仅显示单词数
wc -w sortTest

# 仅显示行数
wc -l sortTest

# 仅显示字节数
wc -c sortTest

# 与管道配合使用
cat sortTest | wc -w
cat passwd | wc -l

sed行编辑器

sed命令,行编辑器,以行为单位进行数据处理,可以将数据行进行替换、删除、新增、选取等工作

使用方式:sed [options] 'command' fileName1 fileName2...

options有:

-n:静默模式,不在默认显示模式空间(模式空间即内存,sed命令会一行一行地把数据读入内存中)中的内容。

-i:直接修改文件,不加此选项,则sed命令不会改变原文件的内容

-e:SCRIPT -e SCRIPT 可以同时执行多个脚本

-f:/PATH/TO/SED_SCRIPT

-r:表示使用扩展正则表达式

command有:

d:删除符合条件的行

p:显示符合条件的行,一般于-n配合使用

a\string:a代表after,在指定的行后面追加新行,内容为string

\n:可以用于换行

i\string:i代表in front,在指定的行前面添加新行,内容为string

c:取代,c的后面可以接字符串

s/pattern/string/修饰符:查找并替换,默认只替换每行中第一次被模式匹配到的字符串,

​ 使用修饰符:

g:行内全部匹配到的模式都替换

i:忽略字符大小写

#文件名:sedTest#
hello1
hello2
hello3
################

# 显示第2行
sed -n '2p' sedTest

# 删除第2行
sed '2d' sedTest
# 删除第2行,并保存到原文件
sed -i '2d' sedTest

# 追加内容,在每一行后加上world
sed 'world' sedTest

# 在匹配到的行后面,追加world
sed -e '/hello2/a\world' sedTest
# 在匹配到的行前面,追加world
sed -e '/hello2/i\world' sedTest

################################

## 查找并替换inittab文件中的内容
# 修改/root/wjw/graduate/course/inittab的最后一行
sed -e 's/id:[0-9]:initdefault:/id:6:initdefault/' inittab
# 或
sed 's/\(id:\)[0-9]\(:initdefault:\)/\16\2/' inittab

# 可以将要修改的值写成变量
version=6
sed -e 's/id:[0-9]:initdefault:/id:$version:initdefault/' inittab
# 或
sed 's/\(id:\)[0-9]\(:initdefault:\)/\1$version\2/' inittab

## 查找并替换配置文件ifcfg-eth0中的内容
# 将IPADDR地址的末尾替换为99
# 步骤如下:
# 先写好正则表达式 s/(IPADDR=([0-9]?[0-9][0-9]?\.){3}).*/\199/
# 再将特殊字符转义:
# \(IPADDR=\([0-9]\?[0-9][0-9]\?\.\)\{3\}\).*/\199/
sed 's/\(IPADDR=\([0-9]\?[0-9][0-9]\?\.\)\{3\}\).*/\199/' ifcfg-eth0

awk文本分析工具

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

awk -F '{pattern + action}' {fileNames}

支持自定义分隔符、正则表达式匹配、自定义变量,数组 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

## 文件名:passwd ##
#7个字段,分别是:用户名、密码(加密)、userId、groupId、userDescription、家目录、默认使用shell的路径## 
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
#################

# 只显示用户名
awk -F ':' '{print $1}' passwd

# 只显示用户名和对应的shell,而且用户名和shell之间以逗号分割,而且所有行开始前添加列名name,shell,在最后一行添加end
awk -F ':' 'BEGIN {print "name,shell"} {print $1 "," $7} END {print "end"}' passwd

# 搜索有root关键字的行,用命令 “/关键字/” 来搜索,$0表示打印整行
awk '/root/ {print $0}' passwd

# 统计文件中,每行的行号,每行的列数,对应得完整行内容
awk -F ':' '{print NR "\t" NF "\t" $0}' passwd

awk练习题:

# 统计报表:合计每人1月工资,0:manager,1:worker
# 报表如下,报名名为 awkSalary
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
#########################################

# 步骤如下:
# 1.将处理过程,写到一个名为script的脚本中,脚本的内容为
{
    split($3,date,"-"); # 对第三列进行分割,分割符为“-”,分割后是一个名为date的数租
    if(date[2]=="01"){names[$1]+=$5};
    if($2=="0"){roles[$1]="Manager"} else{roles[$1]="Worker"};
}
END {
    for(name in names){
        print name "\t" names[name] "\t" roles[name]
    }
}

# 2. 执行脚本
awk -f script awkSalary   # 默认使用空格作为分隔符,可以不用加-F
# 或
awk -F ' ' -f script awkSalary

results matching ""

    No results matching ""