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

读取目录的方式,read/recurse/skip

-

-r, –recursive

--directories=recurse

-

-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

重新指定输入文件的列分隔符 awk -F : ...

-

-v var = value

赋值一个变量 awk -v x=1 ...

变量

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 输出行数