cut:显示切割的行数据
例子:
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:排序文件的行
有哪两种排序:
字典序和数值序
默认按字典序进行排序
例子:
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 -F 'pattern + action' {filenames}
支持自定义分隔符
支持正则表达式匹配
支持自定义变量,数组 a[1] a[tom] map(key)
支持内置变量
支持函数
支持流程控制语句,类C语言
扩展:
第一列是账户,第二列在老版本是密码加密字符串,第三和第四列是用户id和主id号,第五列是账号描述,第六列是家目录,第七列是以交互方式登陆时,启动的交互接口是哪个程序,也就是shell。
例子:
只显示/etc/passwd的账户目录
awk -F ':' '{print $1}' passwd(cut -d':' -f1 passwd)
分隔符为:,$1为第一列
注意:单引号和双引号对bash的区别,bash不对单引号进行扩展,对双引号进行替换。
只是显示/etc/passwd的账户和账户对应的shell,而账户与shell之间以逗号分割,而且在所有行开始前添加列名name,shell,在最后一行添加"blue,/bin/nosh"
第一步:awk -F ':' '{print $1 "\t" $7}' passwd
第二步:awk -F ':' 'BEGIN{print "name\tshell"} {print $1 "\t" $7} END{print "blue,/bin/nosh"}' passwd
注意:BEGIN{}和END{}只有一个,{}可以有多个
第三步:使用cut和sed实现
cut -d':' -f1,7 passwd | sed "1i\name\tshell"
搜索/etc/passwd有root关键字的所有行
awk -F':' '/root/{print $0}' passwd
统计/etc/passwd文件中,每行的行号,每行的列数,对应的完整行内容
awk -F':' '{print NR"\t"NF"\t" $0}' passwd
统计abc用户四月份的工资总额
awk '{split($3,date,"-");if(date[2]=="04"){name[$1]+=$5}} END{for(i in name){print i"\t"name[i]}}' test.txt
升级:第二列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