专注于快乐的事情

awk+sed学习笔记

awk学习指南

awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。

输出第1列和第4例

awk '{print $1, $4}' netstat.txt

其中的$1..$n表示第几例。注:$0表示整个行

过滤记录

awk '$3==0 && $6=="LISTEN" ' netstat.txt

需要表头的话,我们可以引入内建变量NR

awk '$3==0 && $6=="LISTEN" || NR==1 ' netstat.txt

进行格式化

awk '$3==0 && $6=="LISTEN" || NR==1 {printf "%-20s %-20s %s\n",$4,$5,$6}' netstat.txt

指定分隔符

awk 'BEGIN{FS=":"} {print $1,$3,$6}' /etc/passwd
等价下面的
awk -F: '{print $1,$3,$6}' /etc/passwd
-F的指定分隔符,如果有多个,可以使用awk -F ‘[;:]’

改变输出字段分隔符

默认是空格,下面为一个以\t作为分隔符输出的例子
awk -F: '{print $1,$3,$6}' OFS="\t" /etc/passwd

字符串匹配

awk '/ESTABLISHED/' netstat.txt

awk '$6 ~ /FIN/ || NR==1 {print NR,$4,$5,$6}' OFS="\t" netstat.txt
~ 表示模式开始,/ /中是模式

文件分割

按第6例分隔文件,会产生很多小文件
awk 'NR!=1{print > $6}' netstat.txt

awk的一些内建变量

column column
ARGC 命令行参数个数
ARGV 命令行参数排列
ENVIRON 支持队列中系统环境变量的使用
FILENAME awk浏览的文件名
FNR 浏览文件的记录数
FS 设置输入域分隔符,等价于命令行
NF 浏览记录的域的个数
NR 已读的记录数
OFS 输出域分隔符
ORS 输出记录分隔符
RS 控制记录分隔符

应用举例

如果文档为类似如RS #控制记录分隔符这样的构成,我们需要Markdown的表格的生成,可以使用如下

cat c.txt | awk -F '#' '{print $1,$2}' OFS="|" | sed -e 's/^/|/g' -e 's/$/|/g'

sed学习指南

sed全名叫stream editor,是一种在线编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。

哪些行需要编辑-定址

定址用于决定对哪些行进行编辑。地址的形式可以是数字、正则表达式、或二者的结合。如果没有指定地址,sed将处理输入文件的所有行

地址是一个数字,则表示行号;是“$”符号,则表示最后一行。

地址是逗号分隔的,那么需要处理的地址是这两行之间的范围(包括这两行在内)。范围可以用数字、正则表达式、或二者的组合表示。

sed '/My/,10d' datafile
上面的删除包含”My”的行到第十行的内容

Sed的使用参数

-n :安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN 的数据一般都会被列出到终端上。加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来。
-e :表示直接在命令行模式上进行Sed的操作,是默认选项,不用写;
-f :直接将 sed 的动作写在一个文件内, -f filename 则可以运行 filename 内的 sed 动作;
-r :表示使Sed支持扩展正则表达式。(默认是基础正规表示法语法)
-i :直接修改读取的文件内容,而不是输出到终端
n1,n2:不一定需要,选择要进行处理的行。如10,20表示在10~20行之间处理

Sed的action(动作)

Sed的action(动作)支持如下参数。

  • a:表示添加,后接字符串,添加到当前行的下一行。
  • c:表示替换,后接字符串,用它替换n1到n2之间的行。
  • d:表示删除符合模式的行,它的语法为sed ‘/regexp/d’,斜杠之间是正则表达式,模式在d前面,d后面一般不接任何内容。
  • i:表示插入,后接字符串,添加到当前行的上一行。
  • p:表示打印,打印某个选择的数据,通常与-n安静模式一起使用。
  • s:表示搜索,还可以替换,类似于Vim里的搜索替换功能。例如:1,20s/old/new/g表示替换1~20行的old为new,g在这里表示处理这一行所有匹配的内容。

sed应用范例

用s命令替换

将hello替换为“你好”

sed "s/hello/你好/g" test.txt

加上注释

sed 's/^/#/g' test.txt

-i 参数直接修改文件内容

sed -i "s/hello/你好/g" test.txt

删除

显示passwd内容,将2~5行删除后显示
cat -n /etc/passwd |sed '2,5d'

添加行,使用a命令

a命令就是append

在第2行后面的一行加上“Hello China!”字符串

cat -n /etc/passwd |sed '2a Hello China!'

i命令就是insert
cat -n /etc/passwd |sed '2i Hello China!'

最后一行后追加一行
cat -n /etc/passwd |sed '$a Over!'

n参数,只显示第5~7行

cat -n /etc/passwd |sed -n ‘5,7p’

一次替换多个-使用分号

把第一行到第三行的my替换成your,第二个则把第3行以后的This替换成了That
sed '1,3s/my/your/g; 3,$s/This/That/g' test.txt

用&来当做被匹配的变量

sed 's/Hao/[&]/g' test.txt

s命令-数据的搜寻并替换

sed 's/要被取代的字串/新的字串/g'

c命令-替换匹配行

sed "2 c 喝牛奶哦" test.txt -i

d命令-删除匹配行

sed '/牛奶/d' test.txt
数据的搜寻并删除

替换换行

Windows下换行符号是“\r\n”,而linux下是“\n”没有”\r”;

sed -i 's/\r$//'

嵌套命令

对3行到第6行,匹配/This/成功后,再匹配/fish/,成功后执行d命令
sed '3,6 {/This/{/fish/d}}' pets.txt

从第一行到最后一行,如果匹配到This,则删除之;如果前面有空格,则去除空格
sed '1,${/This/d;s/^ *//g}' pets.txt
{中的;相当于 如果 .. 则

多点编辑e

cat /etc/passwd | sed -e '3,$d' -e 's/bash/blueshell/'
-e表示多点编辑,第一个编辑命令删除/etc/passwd第三行到末尾的数据,第二条命令搜索bash替换为blueshell。
相当于 and .. and

###操作匹配连续的行
sed '/name/,+3s/^/# /g' test.txt

参考

评论系统未开启,无法评论!