一、grep和正则表达式
1.grep
参数
-v:反显示
-e:使用扩展正则表达式
实例
#输出profile文件里包含after的行
grep after profile
#输出profile文件里不包含after的行
grep -v after profile
2.正则表达式
匹配操作符
\ 转义字符
. 匹配任意单个字符
[1249a],[^12],[a-k] 字符序列单字符占位
^ 行首
$ 行尾
\<,\>:\<abc 单词首尾边界
| 连接操作符
(,) 选择操作符
\n 反向引用
重复操作符:
? 匹配0到1次。
* 匹配0到多次。
+ 匹配1到多次。
{n} 匹配n次。
{n,} 匹配n到多次。
{n,m} 匹配n到m次。
与扩展正则表达式的区别:grep basic
\?, \+, \{, \|, \(, and \)
匹配任意字符
.*
实例
#查询包含ooxx的行
grep "ooxx" grep.txt
#查询包含ooxx单词的行
grep "\<ooxx\>" grep.txt
#查询以ooxx开头的行
grep "^ooxx" grep.txt
#查询以ooxx单词开头的行
grep "^ooxx\>" grep.txt
#查询包含数字的行
grep "[0-9]" grep.txt
#查询包含4-8的行
grep "[4-8]" grep.txt
#查询一行规则的出现ooxx
grep "ooxx.*ooxx" grep.txt
grep "\(oo\)\(xx\).*\1\2" grep.txt
\1 第一个小括号内容 \2第二个小括号内容
二、文本处理命令cut、sort、wc、sed、awk
1.cut 显示切割的行数据
参数
-f:选择显示的列
-s:不显示没有分隔符的行
-d:自定义分隔符
实例
cut -d' ' -f1 grep.txt (不能被切割的行每次都出现,加-s解决)
cut -s -d' ' -f1 grep.txt
cut -s -d' ' -f1,3 grep.txt
cut -s -d' ' -f1-3 grep.txt
2.sort 排序文件的行(包括数值序,字典序。默认字典序)
参数
-n:按数值排序
-r:倒序
-t:自定义分隔符
-k:选择排序列
-u:合并相同行
-f:忽略大小写
实例
sort -t' ' -k2 sort.txt #默认字典序
sort -t' ' -k2 -n sort.txt #-n表示按照数值序
sort -t' ' -k2 -nr sort.txt #-r倒序
3.wc 统计行数
wc -l sort.txt
cat sort.txt | wc -l
ls -l /etc/ | wc -l
4.sed 行编辑器(相当于vi的末行模式拆出来)
语法 sed [options] 'AddressCommand' file ...
参数
-n: 静默模式,不再默认显示模式空间中的内容
-i: 直接修改原文件
-e: SCRIPT -e SCRIPT:可以同时执行多个脚本
-f: /PATH/TO/SED_SCRIPT
-r: 表示使用扩展正则表达式
行编辑器Command
d 删除符合条件的行;
p 显示符合条件的行;
a \string: 在指定的行后面追加新行,内容为string
\n:可以用于换行
i \string: 在指定的行前面添加新行,内容为string
r FILE: 将指定的文件的内容添加至符合条件的行处
w FILE: 将地址指定的范围内的行另存至指定的文件中;
s/pattern/string/修饰符: 查找并替换,默认只替换每行中第一次被模式匹配到的字符串
g 行内全局替换
i 忽略字符大小写
s///: s###, s@@@
\(\), \1, \2
实例
#在第一行下面插入hello world
sed "1a\hello world" sort.txt (此时源文件没有发生变化 )
sed -i "1a\hello world" sort.txt (加上-i源文件就变化了)
#删掉hello world
sed -i "2d" sort.txt
#删掉带数字的行
sed -i "/[0-9]/d" sort.txt
#包含数字的行打印出来,其他行不显示
sed -n "/[0-9]/p" sort.txt
#查找替换实例,扩大查找范围至精确匹配
sed "s/id:[0-6]:initdefault/id:5:initdefault/ig" inittab
#圈定元素
sed "s/\(id:\)[0-6]\(:initdefault\)/\15\2/ig" inittab
5.awk 一个强大的文本分析工具
awk就是把文件逐行的读入,(空格,制表符)为默认分隔符将每行切片,切开的部分再进行各种分析处理。注意:天生对空白符敏感,空白符不用去切。
语法 awk -F '{pattern + action}' {filenames} (注意必须是单引号)
-支持自定义分隔符
-支持正则表达式匹配
-支持自定义变量,数组 a[1] a[tom] map(key)
-支持内置变量
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
实例
#只显示用户列(第一列),冒号分割
awk -F ':' '{print $1}' passwd
#只是显示/etc/passwd的账户和账户对应的shell,而账户与shell之间以逗号分割,
#而且在所有行开始前添加列名name,shell,在最后一行添加"end"
awk -F ':' 'BEGIN{print "name\tshell"} {print $1 "\t" $7} END{print "end"}' passwd
#搜索/etc/passwd有root关键字的所有行
awk '/root/{print $0}' passwd (每一行匹配root才会调用{打印}方法)
awk '/root/{print $0} {print $0}' passwd (此时每行匹配上了就会调2次打印)
#统计/etc/passwd文件中,每行的行号,每行的列数,对应的完整行内容
awk -F':' '{print NR"\t"NF"\t"$0}' passwd
文件 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:manager,1:worker
#1.合计每人1月份工资
awk '{
split($3,data,"-");
if(data[2]=="01"){name[$1]+=$5}
}
END{
for(i in name){print i"\t"name[i]}
}' awk.txt
#2.合计每人1月份工资,每行带角色
awk '{
split($3,data,"-");
if(data[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
网友评论