正则表达式
正则表达式是在一个或多个文件内容中搜索某一特定字符模式。 Linux 中所有命令的输出结果都被分割符(默认为空格)划分为几部分, $1
、 $2
依次表示这些部分, $0
表示整个命令, $NF
表示一行有几部分,NF 表示一行的最后一个部分,NR 表示第几行。
通配符
首先要了解匹配模式中的通配符
c*
匹配 0 个(即空白)获取多个字符 c
.
匹配任何一个字符
[xyz]
匹配方括号(集合)中的任意一个字符
[^xyz]
匹配不包括方括号中的字符的全部字符
^
匹配行的开头
$
匹配行的结尾
如果要匹配通配符,需要加反斜杠 \
转译
grep
grep 具有如下格式:
grep [options] method file
options:
-c 列出包含模式的行数
-i 忽略模式中的字母大小写
-l 列出带有匹配行的文件名
-n 在每行的最前面列出行号
-v 列出没有匹配模式的行
-w 把表达式作为一个完整的单字来搜索
除 -w 选项外其它选项均可在 egrep 和 fgrep 命令中使用。例如:
grep -c 'main' main.cpp
在 main.cpp 文件中匹配 main 字串,同时列出包含模式的行数
grep 有两个变种,其中 egrep 在调用时自动使用了 -F 选项,语法格式与 grep 相同,多用于在一个或多个文件内容中利用扩展的正则表达式的元字符搜索特定的模式
额外的元字符:
+
匹配一个或多个前导字符
a|b
匹配 a 或 b
(RE)
匹配括号中的正则表达式 RE
fgrep 在调用时自动使用了 -E 选项,搜索速度比 grep 快,可以一次搜索多个模式,不能搜索正则表达式,将通配符当作普通字符处理
sed
用于搜索和替换字符串,具有如下格式:
sed [options] 'expression' file
其中 options 主要有:
-i 修改后文件替换原文件
-n 不输出原文件,只输出命令执行后的结果
-f 使用命令文件,即从文件中读取命令
expression 具有格式:
[范围]s/正则表达式/替换模式/[操作标识]
常用操作标识:
g 表示要替代每一行中出现的全部模式
n 只替代前 n 行出现的模式
d 删除匹配模式
可以同时使用两个命令表达式,但它们之间要用 ;
隔开,例如
'/hello/d;s/abc/ABC/g'
这就是两个匹配模式; sed 会返回操作的结果,因此可以将结果导入一个文件
sed '/hello/d;s/abc/ABC/g' file1 > file2
当然,也可以选择原地修改文件,只需要使用 -i 参数
sed -i '/hello/d;s/abc/ABC/g' file
awk
awk 比较特殊,它可以使用一些语法命令,具有格式:
awk '{commands}'
其中 commands 为一个或多个命令(常用 print );命令表达式之间用 ;
分隔
-f 将从该标志之后的文件中读取指令而不是从命令行读取(即可以将指令存在文件中读取)
-Fc 表示字段之间分隔符是 c 而不是默认空白字符(c 是自定义的字符)
BEGIN 和 END
命令中较为重要的是开始 BEGIN 和结束 END 命令,具有格式:
awk 'BEGIN {...} END {...}'
BEGIN:之后列出的操作(在
{}
内)将在 awk 开始扫描输入之前执行,即在获得文件输入前进行输出,使用 BEGIN 来显示变量和预置(初始化)变量END:之后列出的操作将在扫描完全部的输入之后执行,使用 END 来输出最终结果
for 循环
我们用一个例子说明 for 循环的使用。在 command 文件中存放如下指令:
{count[length($1)]++} END {for (i=1;i<9;i++) print "There are " count[i] "users"}
则可以在控制台中读取 command 中的指令
awk -F: -f command < test
这表示用 :
作为字段分隔符(这样就会忽略空格),从之后的 command 文件中读取命令
条件语句
同样的,我们用一个例子说明 if 的使用:
awk -F: '{if (length($1) == 3) print $0}' test
这个命令是说如果传入参数长度是 3 ,就输出脚本名
自建函数
shell 提供了一些简单的函数使用
查找字符串的函数 index ,它返回子字符串第一次出现的位置,若没有返回 0
'index(str, substr)'
返回字符串长度的函数 length
'length(str)'
在源字符串中按正则表达式匹配子字符串,若有多条符合,则返回最左方的子字符串
'match(str, 正则表达式)'
同时内建变量
RSTART
:符合条件的子字符串在原字符串中的位置,若没有则为 0
RLENGTH
:符合条件的字符串长度,若没有则为 -1
最终会返回 RSTART
的值
截取字符串的函数 substr
'substr($row, start, length)'
例如截取第二列(78944)中的44
echo "123456 78944" | awk '{print substr($2, 4, 2)}'
cat
用于连接文件并打印到标准输出设备上,即将文件内容输出到另一个文件中,或是将文件内容输出到控制台,可参考 > 的输入输出功能
cat test # 输出 test 内容到控制台
常用于查看文件内容
wc
用来统计指定文件中的行数、单词数、字符数
wc [options] file-lise
-l 统计行数
-w 统计单词数
-c 统计字节数,一个中文三字节
-m 统计字符数,和 -c 不能同时出现
curl
用于向网页发起请求,没有参数时表示以 GET 方式获取网页
curl src
-i 参数打印出服务器回应的 HTTP 标头
-s 参数将不输出错误和进度信息
wget
用于下载网络数据,没有参数时表示下载单个文件
wget src