1.1 基础正则表达式
1.1.1 正则表达式与通配符
正则表达式用来在文件中匹配符合条件的字符串,正则是包含匹配。
grep awk sed 等命令可以支持正则表达式
grep (global search regular expression and print out the line) 提取行
包含匹配字符串
通配符用来匹配符合条件的文件名,通配符是完全匹配。
ls find cp 这些命令不支持正则表达式,所以只能使用Shell自己的通配符来进行匹配了
完全匹配文件名
anaconda-ks.cfg 安装信息
1.1.2 基础正则表达式
元字符 作用
* 前一个字符匹配0次或任意多次
. 匹配除了换行符外任意一个字符
^ 匹配行首。例如:^hello会匹配以hello开头的行
$ 匹配行尾。例如:hello$会匹配以hello结尾的行
[] 匹配中括号中指定的任意一个字符
[^] 匹配除中括号中字符以外的任意字符
\ 转义字符 用于取消特殊符号的含义
\{n\} 表示其前面的字符恰好出现n次。
[0-9]\{4\} 匹配4位数字
[1][3-8][0-9]\{9\} 匹配手机号码
\{n,\} 表示其前面的字符出现不小于n次。
\{n,m\} 不小于n次,不大于m次
1.1.3 字符截取命令
cut字段提取命令
cut 选项 文件名
-f 列号: 提取第几列
-d 分隔符:按照指定分隔符分割列 默认分隔符是制表符:Tab
vi student.txt
ID Name Gender Mark
1 Zhang M 86
2 Li M 90
3 Wang M 83
#中间不是空格,是Tab键
cut -f 2 student.txt
cut -f 2,4 student.txt
cut -d ":" -f 1,3 /etc/passwd
cat /etc/passwd | grep /bin/bash | grep -v root | cut -d ":" -f 1
cut 命令的局限——对于空格分隔无能为力,需要用awk命令
df -h | cut -d " " -f 1,3
1.1.4 printf命令
printf '输出类型输出格式' 输出内容
输出类型:
%ns 输出字符串。n是数字,指代输出几个字符
%ni 输出整数。n是数字,指代输出几个数字
%m.nf 输出浮点数。m和n是数字,指代输出的总位数和小数位数
输出格式:
\a 输出警告音
\b 输出退格键Backspace
\f 清除屏幕
\n 换行
\r 回车键Enter
\t 水平输出退格键,也就是Tab键
\v 垂直输出退格键,也就是Tab键
printf '%s %s %s\n' 1 2 3 4 5 6 #三个为一组,换行输出
printf '%s' $(cat student.txt) #作为一个连续的整体输出:IDNAMEGENDER....
printf '%s\t %s\t %s\t %s\t\n' $(cat student.txt) #同样格式输出
在awk命令的输出中支持print和printf命令
print:会在每个输出之后自动加入一个换行符(Linux默认没有print命令)
printf:是标准格式输出命令,并不会自动加入换行符,如果需要换行,需要手工加入换行符
1.1.5 awk命令
pattern scanning and processing language
截取列
分隔符默认是Tab 和 空格
awk ‘条件1{动作1}条件2{动作2}...’ 文件名
条件(Pattern)
一般使用关系表达式作为条件
x> 11 判断变量x是否大于11
x>=11 大于等于
x<=11 小于等于
动作(Action)
格式化输出
流程控制语句
vi student.txt
ID Name PHP Linux MySQL Average
1 Zhang 82 95 86 87.66
2 Li 74 96 87 85.66
3 Wang 99 83 93 91.66
awk '{printf $2 "\t" $6 "\n"}' student.txt
{}之间的是正则
$0代表整行
$1代表第一列
$2代表第二列
df -h | awk '{print $1 "\t" $5 "\t" $6}'
df -h | grep sda5 | awk '{print $5}' | cut -d "%" -f 1
BEGIN
awk 'BEGIN{print "test !!"} {print $2 "\t" $5}' student.txt
BEGIN 后的动作只执行一次
FS内置变量
用FS指定分隔符
awk 'BEGIN{FS=":"}{print $1 "\t" $3}' /etc/passwd
cat /etc/passwd | grep "/bin/bash" | awk 'BEGIN {FS=":"}{printf $1 "\t" $3 "\n"}'
END
awk 'END{print "The End"}{printf $2 "\t" $6 "\n"}' student.txt
关系运算符
cat student.txt | grep -v Name | awk '$6 >= 87 {printf $2 "\n"}'
awk 是可以编程的
1.1.6 sed 命令
grep 行截取
cut awk 列截取
sed是一种几乎包括在所有UNIX平台(包括Linux)的轻量级流编辑器。
stream editor for filtering and transforming text
sed主要是用来将数据进行选取、替换、删除、新增的命令
用于操作命令的结果,实际应用于Shell脚本
sed 选项 '[动作]' 文件名
选项:
-n 一般sed命令会把所有数据都输出到屏幕,如果加入此选择,则只会把经过sed命令处理的行输出到屏幕
-e 允许对输入数据应用多条sed命令编辑
-i 用sed的修改结果直接修改读取数据的文件,而不是由屏幕输出
动作:
a \ 追加,在当前行后添加一行或多行。
添加多行时,除最后一行外,每行末尾需要用“\”代表数据未完结
c \ 行替换,用c后面的字符串替代原数据行,替换多行时,除最后一行外,
每行末尾需用“\”代表数据未完结
i \ 插入,在当前行前插入一行或多行。
插入多行时,除最后一行外,每行末尾需要用“\”代表数据未完结
d 删除,删除指定的行
p 打印,输出指定的行
s 字串替换,用一个字符串替换另外一个字符串。格式为“行范围s/旧字串/新字串/g”
和vim中的替换格式类似
sed '2p' student.txt
#查看文件的第二行,文件全部显示,第二行出现两次
sed -n '2p' student.txt
#只出现第二行
df -h | sed -n '2p'
sed '2,4d' student.txt
#删除第二行到第四行的数据,但不修改文件本身
sed '2a hello' student.txt
#在第二行后追加hello
sed ‘2i hello \ world’student.txt
#在第二行前插入两行数据
sed '2c No such person' student
#数据替换
字符串替换
sed 's/旧字串/新字串/g' 文件名
sed '3s/74/99/g' student.txt
#在第三行中,把74换成99
sed -i '3s/74/99/g' student.txt
#sed操作的数据直接写入文件
sed -e 's/Zhang//g;s/Wang//g' student.txt
#同时把“Zhang”和“Wang”替换为空
尽量不用i,如需修改文件,用vim编辑器
1.1.7 字符处理命令
排序命令 sort
sort 选项 文件名 可以接受管道符
-f 忽略大小写
-n 数值型排序,默认以字符串型排序
-r 反向排序
-t 指定分隔符,默认为制表符
-k n,m 指定从n字段到m字段进行排序
sort /etc/passwd
sort -r /etc/passwd
sort -t ":" -k 3,3 /etc/passwd 用UID排序
sort -n -t ":" -k 3,3 /etc/passwd
统计命令wc
wc 选项 文件名 可以接受管道符
-l 行数
-w 单词数
-m 字符数