sed|awk

sed的用法

sed(stream editor)是流编辑器,可对文本文件和标准输入进行编辑。
sed只是对缓冲区中原始文件的副本进行编辑,并不编辑原始的文件,如果需要保存改动内容,可以选择使用下面两种方法:
重定向
w编辑命令 -i 选项
sed基本格式

sed option 'script' file1 file2 ...
sed option -f scriptfile file1 file2 ...

选项含义:

--version            显示sed版本。
--help               显示帮助文档。
-n,--quiet,--silent  静默输出,默认情况下,sed程序在所有的脚本指令执行完毕后,将自动打印模式空间中的内容,这些选项可以屏蔽自动打印。
-e script            允许多个脚本指令被执行。
-f script-file, 
--file=script-file   从文件中读取脚本指令,对编写自动脚本程序来说很棒!
-i,--in-place        直接修改源文件,经过脚本指令处理后的内容将被输出至源文件(源文件被修改)慎用!
-l N, --line-length=N 该选项指定l指令可以输出的行长度,l指令用于输出非打印字符。
--posix             禁用GNU sed扩展功能。
-r, --regexp-extended  在脚本指令中使用扩展正则表达式
-s, --separate      默认情况下,sed将把命令行指定的多个文件名作为一个长的连续的输入流。而GNU sed则允许把他们当作单独的文件,这样如正则表达式则不进行跨文件匹配。
-u, --unbuffered    最低限度的缓存输入与输出。

以上仅是sed程序本身的选项功能说明,至于具体的脚本指令(即对文件内容做的操作)后面我们会详细描述.

  • sed的语法:sed '样式命令'文件
    sed是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。(通过非交互式来修改文本中的内容)

意思是 如果文件中的某一行符合样式,就执行指定的sed命令 如删除(d)替换是(s)
“样式”使用一对//含括,表示寻找的意思。也可以指定数据行的范围:如1,6
注意 sed不加"-i"的情况下是不修改文件内容的 只是读取文件的内容 >>

p   打印匹配行
=   打印文件行号
a\  在定位行号之后追加文本信息
i\  在定位行号之前插入文本信息
d   删除定位行
c\  用新文本替换定位文本
s   使用替换模式替换相应模式
r   从另一个文件中读文本
w   将文本写入到一个文件
y   变换字符
q   第一个模式匹配完成后退出
l   显示与八进制ASCII代码等价的控制字符
{}  在定位行执行的命令组
n   读取下一个输入行,用下一个命令处理新的行
h   将模式缓冲区文本拷贝到保持缓冲区
H   将模式缓冲区文本追加到保持缓冲区
x   互换模式缓冲区和保持缓冲区内容
g   将保持缓冲区内容拷贝到模式缓冲区
G   将保持缓冲区内容追加到模式缓冲区
g 与s使用表示全局匹配替换  
p 打印匹配行  
s 替换  
-n 取消默认输出  
-e 允许多项编辑  
-i 修改原文件  

sed基本用法

sed删除用法
sed ‘1,4d’dataf1 #把第一行到第四行删除,并且显示剩下的内容  
sed ‘/La/d’dataf2 #把含有La的行删除  
sed '/La/!d' dataf2  #把不含La的行删除,!是否定的意思  
sed ‘/[0-9]\{3\}/d’dataf3#把有”3位数”的行删除sed  
sed '/^$/d' dataf5  #删除空行  
sed 显示用法  
sed -n '/La/p' dataf2#显示含有La的行  
sed 替换用法(把-n 换成-i 就是直接替换原文件了)  
sed -n 's/La/Oo/p' dataf2 #把La替换为Oo-n是抑制sed显示其他行  
sed -n 's/La//p' dataf2 #把La替换为空  
sed -n 's/La/Oo/gp' dataf2  #加g是全局替换的意思  
sed -n 's/^...//p' dataf2  #把每行开头的3个字符替换为空  
sed -n 's/...$//p' dataf2 #把每行结尾的3个字符替换为空  
sed -n 's/La/10o/p' dataf2 #替换  
sed -n '/AAA/s/234/567/p' dataf6#找到含有AAA的行,然后把234替换成567  
sed -n '/AAA/,/DDD/s/B/567/p' dataf7#找到含有AAA到DDD的那几行,将B替换成567   
sed -n '/AAA/,/DDD/s/B/567/gp' dataf7   #全局
sed -n "/^[[:space:]]*Port/cPort 22" /etc/ssh/sshd_config  修改ssh连接端口

awk的用法

awk是一种编程语言,软件级别等同于bash,主要用于在linux/unix下对文本和数据进行处理。数据可以来自标准输入、一个或多个文件,或其它命令的输出。它支持用户自定义函数和动态正则表达式等先进功能,是linux/unix下的一个强大编程工具。它在命令行中使用,但更多是作为脚本来使用。awk的处理文本和数据的方式是这样的,它逐行扫描文件,默认从第一行到最后一行,寻找匹配的特定模式的行,并在这些行上进行你想要的操作。如果没有指定处理动作,则把匹配的行显示到标准输出(屏幕),如果没有指定模式,则所有被操作所指定的行都被处理。
awk的工作方式是读取数据文件,将每行数据视为一条记录,每笔记录以字段分隔成若干个字段,然后输出各个字段的值
awk比sed强的地方在于不仅能以行为单位还能以列为单位处理文件。awk缺省的行分隔符是换行,缺省的列分隔符是连续的空格和Tab,但是行分隔符和列分隔符都可以自定义,比如/etc/passwd文件的每一行有若干个字段,字段之间以:分隔,就可以重新定义awk的列分隔符为:并以列为单位处理这个文件
awk的常用格式

awk "样式" 文件 : 把符合样式的数据行显示出来  
awk '{操作}' 文件: 对每一行都执行{}中的操作  
awk '样式{操作}' 文件: 对符合样式的数据行,执行{}中的操作  
1)命令模式
        awk [options] 'commands' file(s)
            command 部分:/范围说明/{awk命令语句1;awk命令语句2;}
                范围说明部分可以是BEGIN、END、逻辑表达式或者为空
                awk命令语句间用分号间隔
                引用shell 变量需用双引号引起
            option 部分
                -F 定义字段分割符号
        
2)脚本模式
        awk [options] -f scriptfile file(s)
        特点:
            awk脚本是awk命令的清单
            命令需要用分号间隔
            #号开头的是注释行
            # /bin/awk -f 
变量名 属性
$0 当前记录
$1~$n 当前记录的第N个字段
FS 输入字段分隔符默认是空格
RS 输入记录分割符,默认为换行符
NF 当前记录中的字段个数,就是有多少列
NR 以及读出的记录数,就是行号,从1开始
OFS 输出字段分隔符 默认也是空格
ORS 输出的记录分隔符 默认为换行符

awk的示例

取倒数第一列和倒数第二列
$ head -1 passwd |awk -F':' '{print $NF,$(NF-1)}'
/bin/bash /root
换行符(默认处理一行后才换行)
$ head -1 passwd |awk -F':' '{print $NF RS $(NF-1)}'
/bin/bash
/root
$head -1 passwd | awk 'BEGIN {FS=":"} {print $NF RS $(NF-1)}' 

一次指定多个分隔符
$ awk -F':|/' '{print NF}' passwd 
$ awk -F'[:/]' '{print NF}' passwd 
$ ifconfig eth0|grep Bcast|awk -F':| +' '{print $4}'
$ifconfig eth0 |grep Bcast | awk -F" " '{print $2}'|awk -F":" '{print $2}'

打印标题和结尾信息
$ awk -F':'  'BEGIN {print "user\tpasswd\thome"RS"----------------------"} ; {print $1"\t"$2"\t"$(NF-1)} ; END {print "<-----------END---------->"}' passwd 
user    passwd  home
----------------------
root    x       /root
bin     x       /bin
daemon  x       /sbin
adm     x       /var/adm
lp      x       /var/spool/lpd
<-----------END---------->
正则表达式
awk '/La/' dataf3 #显示含有La的数据行  
awk '{print $1, $2}' dataf3 #显示dataf3每一行的第一个和第二个字段  
awk ‘/La/{print $1, $2}’ dataf3#将含有关键词La的数据行的第1和第2个字段显示  
awk -F: '/^ceshi/{print $3, $4}' /etc/passwd #用-F指定:为分隔符,账号ols3的第三段和第四段显示  
awk -F: 'BEGIN{OFS="+++"}/^mail/{print $1, $2, $3, $4, $5, $6, $7}' /etc/passwd
OFS的作用是存储输出字段的分隔符  
awk应用  
取网卡的IP地址  
ifconfig |sed -n '2p' |awk -F: '{print $2}' |awk '{print $1}'
取网络设备的名称:  
cat /proc/net/dev/sed -n '4p'|awk -F: '{print $1}'  
取系统内存大小  
cat /proc/meminfo |awk '/MemTotal/{print $1,$2}'
cat /proc/meminfo |sed -n '1p'
用netstat -ntl 截取所有开放的端口号
netstat -ntl |grep -v Active| grep -v Proto|awk '{print $4}'|awk -F: '{print $NF}'
netstat -ntlup |grep -Ev "Active|Proto" |awk '{print $4}' |awk -F: '{print $NF}'

awk流程控制
if
# awk -F: '{if($3>500) print $1,$3,"普通用户"}' /etc/passwd
# awk -F: '{if($3>500) print $1,$3,"普通用户";else print $1,$3,"不是普通用户"}' /etc/passwd
# awk -F: '{if($3==0) print $1,$3,"管理员";else if($3<500) print $1,$3,"系统用户";else print $1,$3,"普通用户"}' /etc/passwd
for 
# awk 'BEGIN {for(i=0; i<=10; i++) print i}'

while
# awk 'BEGIN {i=0;while(i<=5) {print i;i++}}'
# awk 'BEGIN {i=0;while(i<=5) {print"service",i,"start";i++}}'

#循环的控制:
break       --条件满足的时候中断循环
continue        --条件满足的时候跳过循环
# awk 'BEGIN {i=0;while(i<=5) {i++;if(i==3) continue; print i}}'
# awk 'BEGIN {i=0;while(i<=5) {i++;if(i==3) break; print i}}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容

  • grep grep的基本用法 grep命令是支持正则表达式的一个多用途文本搜索工具,一般格式为 grep 选项 模...
    王诗翔阅读 2,897评论 2 34
  • linux资料总章2.1 1.0写的不好抱歉 但是2.0已经改了很多 但是错误还是无法避免 以后资料会慢慢更新 大...
    数据革命阅读 12,128评论 2 34
  • sed与awk实例 文本间隔 在每一行后面增加一空行 将原来的所有空行删除并在每一行后面增加一空行。这样在输出的文...
    stuha阅读 1,881评论 0 21
  • netstat -tnlp|egrep -i "$1"|awk {'print $7'}|awk -F'/' '{...
    JerichoYu阅读 993评论 0 0
  • 本文承接之前写的三十分钟学会AWK一文,在学习完AWK之后,趁热打铁又学习了一下SED,不得不说这两个工具真的堪称...
    mylxsw阅读 4,382评论 3 74