一、cut显示切割的行数据
不想全看,只想看其中几列!
f :显示切割的行数据
s :不显示没有分隔符的行
d :自定义分隔符
1、-d ’ '给出分隔符(空格),-f1显示第一列
cut -d ' ' -f1 grep.txt
2、如果一行数据只有一列(脏数据),-f2的时候脏数据也会被显示出来,去除脏数据 -s:
cut -d' ' -f2 -s grep.txt
3、只显示第一列和第三列:
cut -d' ' -f1,3 -s grep.txt
4、显示第1,2,3列:
cut -d' ' -f1-3 -s grep.txt
二、sort排序,有字典序和数值序,默认字典序,整行比较
-n 按数值排序
-r 倒序
-t自定义分隔符
-k选择排序列
-u合并相同行
-f忽略大小写
1、以空格切割,排第二列
sort -t' ' -k2 sort.txt
2、空格切割,排第二列,以数值排
sort -t' ' -k2 -n sort.txt
三、wc查看多少行
1、wc -l sort.txt,得到的结果是:3 sort.txt
2、cat sort.txt | wc -l得到的结果是:3
四、Sed行编辑器
-n: 静默模式,不再默认显示模式空间中的内容
-i: 直接修改原文件
-e SCRIPT -e SCRIPT:可以同时执行多个脚本
-f /PATH/TO/SED_SCRIPT
-r: 表示使用扩展正则表达式
d: 删除符合条件的行;
p: 显示符合条件的行;
a \string: 在指定的行后面追加新行,内容为string
\n:可以用于换行
i \string: 在指定的行前面添加新行,内容为string
r FILE: 将指定的文件的内容添加至符合条件的行处
w FILE: 将地址指定的范围内的行另存至指定的文件中;
s/pattern/string/修饰符: 查找并替换,默认只替换每行中第一次被模式匹配到的字符串
g: 行内全局替换
i: 忽略字符大小写
s///: s###, s@@@
(), \1, \2
1、删除第一行,但是原始文件还在,没改变
sed "1d" sort.txt
2、想改动源文件
sed -i "1d" sort.txt
3、在第一行下面追加一行,内容是hello worlld
sed "1a\hello world" sort.txt
4、打印只包含a的行, /a/ 表示查找,p表示打印
sed -n "/a/p" sort.txt
5、支持正则,显示带有数字的行
sed -n "/[0-9]/p" sort.txt
6、(查找并替换)查找文件内每一行的数字0-6,并把第一个数字替换成6
sed "s/[0-6]/5/" inittab
7、把引用的相同部分用(***)和\1引用
sed "s/\(id:\)[0-6]\(:initdef\)/\15\2/" inittab
五、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
1、以冒号为分隔符处理每一行,处理逻辑必须用 ‘’ 将其作为参数传到方法体中,打印
awk -F ' : ' '{print $1}' passwd
2、BEGIN和END方法单独调用,读取每一行被冒号“ :”分隔,打印出第一列和第七列
awk -F':' 'BEGIN{print "name\tshell"} {print $1 "\t" $7} END{print "welcome ......"}'
3、匿名函数可以有多个,比如:打印先读取第一行执行第一个匿名函数,在执行第二个匿名函数。接着读取第二行继续调用执行语句
awk -F ':' 'BEGIN{print "name\tshell"} {print $1 "\t" $7 } {print $0} END{print "welcome ......"}' passwd
4、搜索打印passed文件中有关键字:root的行
awk '/root/ {print $0}' passwd
5、打印出文件中有0-7的行
awk '/[0-7]/ {print $0}' passwd
6、打印出每行的行号、列数和完整一行
awk -F':' '{print NR "\t" NF "\t" $0} ' passwd
7、读取awk文件默认制表符分隔每一行,将第三列以中线“-”分隔若==01就把第五列得值相加。在END函数中以增强型for循环用i in来迭代name,i代表数组的key name name[i]代表value
awk '{split($3,date,"-");if(date[2]==01){name[$1]+=$5}} END{for(i in name){print i "\t" name[i]}}' awk.txt
8、根据以上需求,额外的将第二列的角色进行归属、打印
awk '{split($3,date,"-");if(date[2]==01){name[$1]+=$5;if($2=="0"){role[$1]="M"}else{role[$1]="W}}} END{for(i in name){print i "\t" name[i] "\t" role[i]}}' awk.txt