linux文本处理grep、sed、awk
- linux文本处理grepsedawk
- grep
- sed
- awk
grep
grep [options] PATTERN [FILE]
grep | 选项 | 解释 |
- | ||
- | 正则表达式的选择 | |
- | -E, –extended-regexp | 扩展的正则表达式,同命令egrep(已废弃),字符`? + { } |
- | -G, –basic-regexp | 基本正则表达式,grep默认执行,字符`? + { } |
- | -F, –fixed-regexp | 所有搜索都是普通字符串,不进行正则匹配 |
- | -P, –perl-regexp | 使用Perl正则表达式 |
- | -e, –regexp=PATTERN | 用PATTERN来匹配 |
- | -f, –file=FILE | 指定规则文件 |
- | -i, –ignore-case | 忽略大小写 |
- | -w, –word-regexp | 强制PATTERN仅完全匹配字词 |
- | -x, –line-regexp | 强制PATTERN仅完全匹配一行 |
- | ||
- | 杂项 | |
- | -s, –no-messages | 不显示错误信息 |
- | -v, –invert-match | 选中不匹配的行 |
- | ||
- | 输出控制 | |
- | -m, –max-count=NUM | NUM次匹配后停止 |
- | -b, –byte-offset | 输出的同时打印字节偏移 |
- | -n, –line-number | 输出的同时打印行号 |
- | -H, –with-filename | 输出同时打印文件名 |
- | -o, –only-matching | 仅输出匹配的部分 |
- | -d, –directories=ACTION | 读取目录的方式, |
- | -r, –recursive | 同 |
- | -l, –files-with-matches | 仅打印匹配的文件名 |
- | -L, –files-without-matches | 仅打印不匹配的文件名 |
- | ||
- | 文件控制 | |
- | -B, –before-context=NUM | 打印匹配文本及前NUM行 |
- | -A, –after-context=NUM | 打印匹配文本及后NUM行 |
- | -C, –context=NUM | 打印匹配文本的前后NUM行 |
sed
sed (stream editor),sed是一个流编辑器,sed把读入的文本,通过一系列编辑命令转换为另一种格式输出。
sed不会改变源文件。
- sed的命令格式
sed option 'script' file1 file2 ...
sed option -f scriptfile file1 file2 ...
sed处理的文件既可以由标准输入重定向得到,也可以当命令行参数传入,命令行参数可以一次传入多个文件,sed会依次处理。sed的编辑命令可以直接当命令行参数传入,也可以写成一个脚本文件然后用-f参数指定。
- sed的执行的方式
/pattern/action
pattern是正则表达式,action是编辑操作。sed程序一行一行读出待处理文件,如果某一行与pattern匹配,则执行相应的action,如果一条命令没有pattern而只有action,这个action将作用于待处理文件的每一行。
- 常用选项
sed | 选项 | 解释 |
- | -n | 取消打印模式空间 |
- | -r | 使用扩展的正则表达式,sed默认运行基本正则匹配 |
- | -s | 将输入文件视为各个独立的文件而不是一个长的连续输入 |
- | -u | 从输入文件中读取最少的数据,更频繁的刷新输出 |
- | -f = FILE | 指定脚本文件 |
- | -e = EXP | 指定脚本 |
- | -i | 直接修改文件的内容 |
模式空间: 当前sed处理的行
- 常用命令
格式 | 含义 |
a | 新增, a 的后面可以接字串,而这些字串会新增在匹配行的下一行 |
i | 插入, i 的后面可以接字串,而这些字串会插入到匹配行的上一行 |
c | 取代, c 的后面可以接字串,这些字串取代匹配行 |
d | 删除, d 后面通常不接任何东西 |
p | 打印,通常 p 会与 -n 选项一起使用 |
s | 替换,s替换 |
- | - |
/pattern/p | 打印匹配pattern的行 |
/pattern/d | 删除匹配pattern的行 |
/pattern/s/pattern1/pattern2/ | 查找符合pattern的行,将该行第一个匹配pattern1的字符串替换为pattern2 |
/pattern/s/pattern1/pattern2/g | 查找符合pattern的行,将该行所有匹配pattern1的字符串替换为pattern2 |
- | - |
- | 数字可作为行数的索引地址,用逗号分隔 |
sed ‘1,10d’ a.txt | 删除1-10 |
awk
sed以行为单位处理文件,awk比sed强的地方在于不仅能以行为单位还能以列为单位处理文件。
awk缺省的行分隔符是换行,缺省的列分隔符是连续的空格和Tab,但是行分隔符和列分隔符都可以自定义。
awk是一门很复杂的脚本语言,但基本用法和sed类似,它可以运行基本运算和流程控制。
- awk命令的基本形式
awk option 'script' file1 file2 ...
awk option -f scriptfile file1 file2 ...
- awk的执行方式
/pattern/{actions}
condition{actions}
如果某一行与pattern匹配,或者满足condition条件,则执行相应的actions,如果一条awk命令只有actions部分,则actions作用于待处理文件的每一行。
- awk需要熟悉的用法
awk常用的内置变量
变量 | 含义 |
FILENAME | 当前输入文件的文件名,该变量是只读的 |
NR | 当前行的行号,该变量是只读的,R代表record |
NF | 当前行所拥有的列数,该变量是只读的,F代表field |
OFS | 输出格式的列分隔符,缺省是空格 |
FS | 输入文件的列分融符,缺省是连续的空格和Tab |
ORS | 输出格式的行分隔符,缺省是换行符 |
RS | 输入文件的行分隔符,缺省是换行符 |
$0 | 当前整行的内容 |
1 2 … | 第一列 第二列 … |
BEGIN { … } | 在整个文件处理之前执行一次 |
END { … } | 在整个文件处理完成后执行一次 |
awk常用选项
awk | 选项 | 解释 |
- | -f,–file=progfile | 指定awk脚本文件 |
- | -F,–field-separator=fs | 重新指定输入文件的列分隔符 |
- | -v var = value | 赋值一个变量 |
变量
awk可以使用变量,但是不需要定义,第一次使用的时候回自动定义变量,变量是全局的。
格式化输出
awk支持printf
格式化输出。
$ awk -v x=0 -F '[:, ]' 'BEGIN{OFS="!"} {print $1,$2,$3,$4; x++} END {print x "lines"}' a.txt
## -v 声明一个变量并赋值
## -F 指定输入文件的列分隔符,用[]指定多个分隔符
## OFS='!' 指定输出分隔符为!
## END 输出行数