grep, sed, awk and RegExp

plus2047 于 2021-10-19 发布

GREP

GREP 用于行扫描,打印指定行

# 扩展正则表达式支持:
grep -E stream
egrep stream
# 只打印匹配部分:
grep -o 

# 扫描文件件中所有文件,-l 选项只打印文件名
grep -rl something ./*.txt

SED

SED = stream editer

# GNU sed
# Replace regExp1 with something
sed -r 's/regExp1/something/g' stream

AWK

AWK 逐行扫描文件并运行脚本。脚本的基本格式:

BEGIN{}
{}
END{}

BEGIN 语句块只在整个程序开始之前运行一次。中间的主语句块将会针对每一行运行一次。末尾的 END 语句块在程序运行结束前运行一次。 AWK 语法与 C/C++ 类似。每条语句末尾分号分隔。

内置变量

AWK 中变量默认不需要 $ 符号调用。

Var Means 功能
$0   当前行
$1~$n   当前行第 n 个域
FS Field Seprator 域分隔符
NF Number of Fields 当前行域数目
NR Now Record 当前行号,(多文件)总行号
FNR File Now Record (多文件)当前文件行号
ENVIRON    

内置函数

gsub sub substr index length match split sprintf strtonum tolower toupper atan2 cos sin exp log sqrt int rand srand print


正则表达式

元字符

元字符 匹配目标
. 除换行符外任意字符
\w 字母(汉字)、数字、下划线
\s 空白字符
\d 数字
\b 单词开始或结束
^ 字符串开始
$ 字符串结束

反斜杠可以给字符转义。

反义

元字符 匹配目标
\W 非字母(汉字)、数字、下划线
\S 非空白字符
\D 非数字
\B 非单词开始或结束
[^xyz] 非 x, y, z

重复

分组或单个字符之后跟随重复标志,说明其重复次数。

标志 次数
* [0,inf)
+ [1,inf)
? [0.1]
{n} n
{n,} [n,inf)
{n,m} [n,m]

“或”条件分支

| 记号左右两边的表达式有一个匹配即可。如 abc|def 匹配 abc 或者 def。这个记号的优先级很低,但是可以结合小括号使用,如: in=='(<|>)' 匹配 in=='<'in=='>'

分组与字符类