【知识积累】大数据旅程-Linux cut/sort/wc/sed/awk

  1. cut
  2. sort
  3. wc
  4. sed > vi
  5. awk

cut:显示切割的行数据

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

例子:
cut -d‘ ’ -f1 test.txt
用空格做为分隔符,显示第一列
cut -d‘ ’ -s -f1 test.txt
用空格做为分隔符,显示第一列,并且只显示有分隔符的行
cut -d‘ ’ -s -f1,3 test.txt
用空格做为分隔符,显示第一列和第三列
cut -d‘ ’ -s -f1-3 test.txt
用空格做为分隔符,显示第一列到第三列

cat test.txt | cut -d‘ ’ -s -f1-3
ls -l /etc | grep "init"

sort:排序文件的行

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

有哪两种排序:
字典序和数值序

默认按字典序进行排序

例子:
sort test.txt
sort -t' ' -k2 -n sort.txt
sort -t' ' -k2 -nr sort.txt

wc:统计
man wc
wc -l text.txt:多少行
cat text.txt | wc -l

sed:行编辑器
语法格式:sed [options] 'AddressCommand' file
n:静默模式,不再默认显示模式空间中的内容(是否打印,n不显示)
i:直接修改原文件
e SCRIPT:可以同时执行多个脚本
f /PATH/TO/SED_SCRIPT
r:表示使用扩展正则表达式

行编辑器Command
d:删除符合条件的
p:显示符合条件的行
a:-a \string,在指定行后面追加行,内容为string
\n:可以用于换行
i:-i \string,在指定行前面追加行,内容为string
r:-r FILE,将指定的文件的内容添加至符合条件的行处
w:-w FILE,将地址指定的范围内的行另存至指定的文件夹中
s:s/pattern/string/修饰符:查找并替换,默认只替换每行中第一次被模式匹配到的字符串
g:行内全局替换
i:忽略字符大小写
s///:s###,s@@@
\(\),1,\2
深度:全量替换 - 扩大 - 水平插入

行编辑器Address
可以没有
给定范围
查找指定行/str/

例子:
sed "1a\hello world" test.txt
1表示Address,a表示Command,然后追加hello world字符串,只是输出到屏幕,不会操作原文件
sed -i "1a\hello world" test.txt
1表示Address,a表示Command,然后追加hello world字符串,修改了原文件
sed -i "2d" test.txt
删除第二行
sed -i "/apple/d" test.txt
删除能够匹配apple的那一行
sed "s@apple@pear@" test.txt
将apple替换成pear,@是分隔符
sed "s/\(id:\)[0-6]\(:initdefault:\)/\15\2/" inittab
将id:1:initdefault:这一行的1-6替换成5,使用扩展正则表达式,\1表示\(\id:\),\2表示\(:initdefault:\)

awk

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

awk -F 'pattern + action' {filenames}
支持自定义分隔符
支持正则表达式匹配
支持自定义变量,数组 a[1] a[tom] map(key)
支持内置变量

  • ARGC:命令行参数个数
  • ARGV:命令行参数排列
  • ENVIRON:支持队列中系统环境变量的使用
  • FILENAME:awk浏览的文件名
  • FNR:浏览文件的记录数
  • NF:浏览记录的域的个数(这行被切分成多少列)
  • NR:已读的记录数(已经处理多少行)
  • OFS:输出域分隔符
  • ORS:输出记录分隔符
  • RS:控制记录分隔符

支持函数

  • print、split、substr、sub、gsub

支持流程控制语句,类C语言

  • if、while、do/while、for、break、continue

扩展:

【知识积累】大数据旅程-Linux cut/sort/wc/sed/awk_第1张图片

第一列是账户,第二列在老版本是密码加密字符串,第三和第四列是用户id和主id号,第五列是账号描述,第六列是家目录,第七列是以交互方式登陆时,启动的交互接口是哪个程序,也就是shell。

例子:
只显示/etc/passwd的账户目录
awk -F ':' '{print $1}' passwd(cut -d':' -f1 passwd)
分隔符为:,$1为第一列

【知识积累】大数据旅程-Linux cut/sort/wc/sed/awk_第2张图片
注意:单引号和双引号对bash的区别,bash不对单引号进行扩展,对双引号进行替换。

【知识积累】大数据旅程-Linux cut/sort/wc/sed/awk_第3张图片
只是显示/etc/passwd的账户和账户对应的shell,而账户与shell之间以逗号分割,而且在所有行开始前添加列名name,shell,在最后一行添加"blue,/bin/nosh"
第一步:awk -F ':' '{print $1 "\t" $7}' passwd

【知识积累】大数据旅程-Linux cut/sort/wc/sed/awk_第4张图片

第二步:awk -F ':' 'BEGIN{print "name\tshell"} {print $1 "\t" $7} END{print "blue,/bin/nosh"}' passwd

【知识积累】大数据旅程-Linux cut/sort/wc/sed/awk_第5张图片

注意:BEGIN{}和END{}只有一个,{}可以有多个
第三步:使用cut和sed实现
cut -d':' -f1,7 passwd | sed "1i\name\tshell" 

【知识积累】大数据旅程-Linux cut/sort/wc/sed/awk_第6张图片
搜索/etc/passwd有root关键字的所有行
awk -F':' '/root/{print $0}' passwd


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

【知识积累】大数据旅程-Linux cut/sort/wc/sed/awk_第7张图片
统计abc用户四月份的工资总额
awk '{split($3,date,"-");if(date[2]=="04"){name[$1]+=$5}} END{for(i in name){print i"\t"name[i]}}' test.txt

【知识积累】大数据旅程-Linux cut/sort/wc/sed/awk_第8张图片

升级:第二列0是manage,1是worker
awk '{split($3,date,"-");if(date[2]=="04"){name[$1]+=$5;if($2=="0"){role[$1]="manager"}else{role[$1]="worker"}}} END{for(i in name){print i"\t"name[i]"\t"role[i]}}' test.txt 

你可能感兴趣的:(BigData,大数据旅程)