- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章sed&awk基本使用方法由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
sed&awk基本使用方法 。
sed 工具简介 。
在了解了一些正规表示法的基础应用之后,再来呢?呵呵~两个东西可以玩一玩的,那就是 sed 跟 awk 了.
这两个家伙可是相当的有用的啊!举例来说,鸟哥写的 logfile.sh 分析登录文件的小程序,绝大部分分析关键词的取用、统计等等,就是用这两个宝贝蛋来帮我完成的! 那么你说,要不要玩一玩啊?! ^_^ 。
我们先来谈一谈 sed 好了,基本上, sed 可以分析 Standard Input (STDIN) 的数据, 。
然后将数据经过处理后,再将他输出到 standrad out (STDOUT) 的一个工具.
至于处理呢?可以进行取代、删除、新增、撷取特定行等等的功能呢!很不错吧~ 我们先来了解一下 sed 的用法,再来聊他的用途好了.
[root@linux ~]# sed [-nefri] [动作] 。
参数:
-n :使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN 。
的数据一般都会被列出到屏幕上。但如果加上 -n 参数后,则只有经过 。
sed 特殊处理的那一行(或者动作)才会被列出来.
-e :直接在指令列模式上进行 sed 的动作编辑,
-f :直接将 sed 的动作写在一个档案内, -f filename 则可以执行 filename 内的 。
sed 动作,
-r :sed 的动作支持的是延伸型正规表示法的语法。(预设是基础正规表示法语法) 。
-i :直接修改读取的档案内容,而不是由屏幕输出.
动作说明: [n1[,n2]]function 。
n1, n2 :不见得会存在,一般代表『选择进行动作的行数』,举例来说,如果我的动作 。
是需要在 10 到 20 行之间进行的,则『 10,20[动作行为] 』 。
function 有底下这些咚咚:
a :新增, a 的后面可以接字符串,而这些字符串会在新的一行出现(目前的下一行)~ 。
c :取代, c 的后面可以接字符串,这些字符串可以取代 n1,n2 之间的行.
d :删除,因为是删除啊,所以 d 后面通常不接任何咚咚,
i :插入, i 的后面可以接字符串,而这些字符串会在新的一行出现(目前的上一行),
p :打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运作~ 。
s :取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配 。
正规表示法!例如 1,20s/old/new/g 就是啦.
范例:
范例一:将 /etc/passwd 的内容列出,并且我需要打印行号,同时,请将第 2~5 行删除.
[root@linux ~]# nl /etc/passwd |sed '2,5d' 。
1 root:x:0:0:root:/root:/bin/bash 。
6 sync:x:5:0:sync:/sbin:/bin/sync 。
7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown 。
.....(后面省略)..... 。
# 看到了吧?因为 2-5 行给他删除了,所以显示的数据中,就没有 2-5 行啰~ 。
# 另外,注意一下,原本应该是要下达 sed -e 才对,没有 -e 也行啦.
# 同时也要注意的是, sed 后面接的动作,请务必以 '' 两个单引号括住喔.
# 而,如果只要删除第 2 行,可以使用 nl /etc/passwd | sed '2d' 来达成, 。
# 至于第 3 到最后一行,则是 nl /etc/passwd | sed '3,$d' 的啦.
范例二:承上题,在第二行后(亦即是加在第三行)加上『drink tea?』字样.
[root@linux ~]# nl /etc/passwd |sed '2a drink tea' 。
1 root:x:0:0:root:/root:/bin/bash 。
2 bin:x:1:1:bin:/bin:/sbin/nologin 。
drink tea 。
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin 。
# 嘿嘿!在 a 后面加上的字符串就已将出现在第二行后面啰!那如果是要在第二行前呢?
# nl /etc/passwd | sed '2i drink tea' 就对啦.
范例三:在第二行后面加入两行字,例如『Drink tea or .....』『drink beer?』 。
[root@linux ~]# nl /etc/passwd | sed '2a Drink tea or ......\ 。
> drink beer ?' 。
1 root:x:0:0:root:/root:/bin/bash 。
2 bin:x:1:1:bin:/bin:/sbin/nologin 。
Drink tea or ...... 。
drink beer ?
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin 。
# 这个范例的重点是,我们可以新增不只一行喔!可以新增好几行~ 。
# 但是每一行之间都必须要以反斜线 \ 来进行新行的增加喔!所以,上面的例子中, 。
# 我们可以发现在第一行的最后面就有 \ 存在啦!那是一定要的喔.
范例四:我想将第2-5行的内容取代成为『No 2-5 number』呢?
[root@linux ~]# nl /etc/passwd | sed '2,5c No 2-5 number' 。
1 root:x:0:0:root:/root:/bin/bash 。
No 2-5 number 。
6 sync:x:5:0:sync:/sbin:/bin/sync 。
# 没有了 2-5 行,嘿嘿嘿嘿!我们要的数据就出现啦.
范例五:仅列出第 5-7 行 。
[root@linux ~]# nl /etc/passwd | sed -n '5,7p' 。
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin 。
6 sync:x:5:0:sync:/sbin:/bin/sync 。
7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown 。
# 为什么要加 -n 的参数呢?您可以自行下达 sed '5,7p' 就知道了!(5-7行会重复输出) 。
# 有没有加上 -n 的参数时,输出的数据可是差很多的喔.
范例六:我们可以使用 ifconfig 来列出 IP ,若仅要 eth0 的 IP 时?
[root@linux ~]# ifconfig eth0 。
eth0 Link encap:Ethernet HWaddr 00:51:FD:52:9A:CA 。
inet addr:192.168.1.12 Bcast:192.168.1.255 。
Mask:255.255.255.0 。
inet6 addr: fe80::250:fcff:fe22:9acb/64 Scope:Link 。
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 。
.....(以下省略)..... 。
# 其实,我们要的只是那个 inet addr:..那一行而已,所以啰,利用 grep 与 sed 来捉 。
[root@linux ~]# ifconfig eth0 | grep 'inet ' | sed 's/^.*addr://g' | 。
\ 。
> sed 's/Bcast.*$//g' 。
# 您可以将每个管线 (|) 的过程都分开来执行,就会晓得原因啰.
# 去头去尾之后,就会得到我们所需要的 IP 亦即是 192.168.1.12 啰~ 。
范例七:将 /etc/man.config 档案的内容中,有 MAN 的设定就取出来,但不要说明内容.
[root@linux ~]# cat /etc/man.config | grep 'MAN'| sed 's/#.*$//g' | 。
\ 。
> sed '/^$/d' 。
# 每一行当中,若有 # 表示该行为批注,但是要注意的是,有时候, 。
# 批注并不是写在第一个字符,亦即是写在某个指令后方,如底下的模样:
# 『shutdown -h now # 这个是关机的指令』,批注 # 就在指令的后方了.
# 因此,我们才会使用到将 #.*$ 这个正规表示法.
范例八:利用 sed 直接在 ~/.bashrc 最后一行加入『# This is a test』 。
[root@linux ~]# sed -i '$a # This is a test' ~/.bashrc 。
# 上头的 -i 参数可以让你的 sed 直接去修改后面接的档案内容喔!而不是由屏幕输出.
# 至于那个 $a 则代表最后一行才新增的意思.
总之,这个 sed 不错用啦!而且很多的 shell script 都会使用到这个指令的功能~ sed 。
可以帮助系统管理员管理好日常的工作喔!要仔细的学习呢.
awk 工具简介 。
相较于 sed 常常作用于一整个行的处理, awk 则比较倾向于一行当中分成数个『字段』来处理。 因此,awk 。
相当的适合处理小型的数据数据处理呢!awk 通常运作的模式是这样的:
[root@linux ~]# awk '条件类型1{动作1} 条件类型2{动作2} ...' filename awk 。
可以处理后续接的档案,也可以读取来自前个指令的 standard output 。 但如前面说的, awk 。
主要是处理『每一行的字段内的数据』,而预设的『字段的分隔符为 "空格键" 或 "[tab]键" 』!举例来说,我们用 last 。
可以将登入者的数据取出来, 结果如下所示:
[root@linux ~]#lastdmtsai pts/0 192.168.1.12 Mon Aug 22 。
09:40 still logged in 。
root tty1 Mon Aug 15 11:38 - 11:39 。
(00:01) 。
reboot system boot 2.6.11 Sun Aug 14 18:18 。
(7+15:41) 。
dmtsai pts/0 192.168.1.12 Fri Aug 12 12:07 - 12:08 。
(00:01) 。
若我想要取出账号与登入者的 IP ,且账号与 IP 之间以 [tab] 隔开,则会变成这样:
[root@linux ~]# last | awk '{print $1 "\t" $3}' 。
dmtsai 192.168.1.12 。
root Mon 。
reboot boot 。
dmtsai 192.168.1.12 。
因为不论哪一行我都要处理,因此,就不需要有 "条件类型" 的限制!我所想要的是第一栏以及第三栏, 。
但是,第二行及第三行的内容怪怪的~这是因为数据格式的问题啊!所以啰~使用 awk 。
的时候,请先确认一下您的数据当中,如果是连续性的数据,请不要有空格或 [tab] 在内,否则,就会像这个例子这样,会发生误判喔.
另外,由上面这个例子您也会知道,在每一行的每个字段都是有变量名称的,那就是 $1, $2... 等变量名称,以上面的例子来说, 。
dmtsai 是 $1 ,因为他是第一栏嘛!至于 192.168.1.12 是第三栏, 所以他就是 $3 。
啦!后面以此类推~呵呵!还有个变数喔!那就是 $0 ,$0 代表『一整列资料』的意思~ 以上面的例子来说,第一行的 $0 。
代表的就是『dmtsai pts/0.... 』那一行啊! 由此可知,刚刚上面四行当中,整个 awk 的处理流程是:
读入第一行,并将第一行的资料填入 $0, $1, $2.... 等变数当中,
依据 "条件类型" 的限制,判断是否需要进行后面的 "动作",
做完所有的动作与条件类型,
若还有后续的『行』的数据,则重复上面 1~3 的步骤,直到所有的数据都读完为止。经过这样的步骤,您会晓得, awk 。
是『以行为一次处理的单位』, 而『以字段为最小的处理单位』。好了,那么 awk 怎么知道我到底这个数据有几行?有几栏呢?这就需要 awk 。
的内建变量的帮忙啦~ 。
变量名称 。
代表意义 。
NF 。
每一行 ($0) 拥有的字段总数 。
NR 。
目前 awk 所处理的是『第几行』数据 。
FS 。
目前的分隔字符,预设是空格键 。
我们继续以上面例子来做说明,如果我想要列出每一行的账号,并且列出目前处理的行数, 并且说明,该行有多少字段,则可以这样 (注意, awk 。
后续的所有动作以 ' 括住, 所以,内容如果想要以 print 打印时,记得,非变量的文字部分,包含上一小节 。
printf 。
提到的格式中,都需要使用双引号来定义出来喔!) 。
[root@linux ~]# last | awk '{print $1 "\t lines: " NR "\t columes: " 。
NF}' 。
dmtsai lines: 1 columes: 10 。
root lines: 2 columes: 9 。
reboot lines: 3 columes: 9 。
dmtsai lines: 4 columes: 10 。
这样可以了解 NR 与 NF 的差别了吧?好了,底下来谈一谈所谓的 "条件类型" 了吧.
awk 的逻辑运算字符 。
既然有需要用到 "条件" 的类别,自然就需要一些逻辑运算啰~例如底下这些:
运算单元 。
代表意义 。
> 。
大于 。
小于 。
>= 。
大于或等于 。
小于或等于 。
== 。
等于 。
!= 。
不等于 。
值得注意的是那个 == 的符号,因为在『逻辑运算』上面, 就是所谓的大于、小于、等于等等的判断式上面,我们习惯上是以 == 。
来表示,而如果是直接给予一个值,例如变量设定时,就直接使用 = 而已。 好了,我们实际来运用一下逻辑判断吧!举例来说,在 。
/etc/passwd 当中是以冒号 ":" 来作为字段的分隔,那假设我要查阅,第三栏小于 10 以下的数据,并且仅列出账号与第三栏, 。
那么可以这样做:
[root@linux ~]# cat /etc/passwd | \ 。
> awk '{FS=":"} $3 。
root:x:0:0:root:/root:/bin/bash 。
bin 1 。
daemon 2 。
......(以下省略)...... 。
有趣吧!不过,怎么第一行没有正确的显示出来呢?这是因为我们读入第一行的时候, 那些变数 $1, $2... 。
预设还是以空格键为分隔的,所以虽然我们定义了 FS=":" 了, 但是却仅能在第二行后才开始生效。那么怎么办呢?我们可以预先设定 awk 。
的变量啊! 利用 BEGIN 这个关键词喔!这样做:
[root@linux ~]# cat /etc/passwd | \ 。
> awk 'BEGIN {FS=":"} $3 ......(以下省略)...... 。
很有趣吧!而除了 BEGIN 之外,我们还有 END 呢!另外,如果要用 awk 来进行『计算功能』呢?以底下的例子来看, 。
假设我有一个薪资数据表,内容是这样的:
Name 1st 2nd 3th 。
VBird 23000 24000 25000 。
DMTsai 21000 20000 23000 。
Bird2 43000 42000 41000 。
如何帮我计算每个人的总额呢?而且我还想要格式化输出喔! 你可以将上面的数据储存成一个名称为 pay.txt 的档案,则:
[root@linux ~]# cat pay.txt | \ 。
> awk 'NR==1{printf "%10s %10s %10s %10s %10s\n",$1,$2,$3,$4,"Total" 。
} 。
NR>=2{total = $2 + $3 + $4 。
printf "%10s %10d %10d %10d %10.2f\n", $1, $2, $3, $4, total}' 。
Name 1st 2nd 3th Total 。
VBird 23000 24000 25000 72000.00 。
DMTsai 21000 20000 23000 64000.00 。
Bird2 43000 42000 41000 126000.00 。
上面的例子有几个重要事项应该要先说明的:
所有的动作,亦即在 {} 内的动作,如果有需要多个指令辅助时,可利用分号『;』间隔, 或者直接以 [Enter] 。
按键来隔开每个指令,例如上面的 NR>=2 后面接的动作, 利用 total = ... 那个指令来指定加总,而后续则以 。
printf 来格式化输出.
逻辑运算当中,如果是『等于』的情况,则务必使用两个等号『==』.
格式化输出时,在 printf 的格式设定当中,务必加上 \n ,才能进行分行.
与 bash shell 的变量不同,在 awk 当中,变量可以直接使用,不需加上 $ 符号.
利用 awk 这个玩意儿,就可以帮我们处理很多日常工作了呢!真是好用的很~ 此外, awk 的输出格式当中,常常会以 。
printf 。
来辅助,所以, 最好您对 printf 也稍微熟悉一下比较好啦!另外, awk 的动作内 {} 也是支持 if (条件) 的喔.
举例来说,上面的指令可以修订成为这样的 。
[root@linux ~]# cat pay.txt | \ 。
> awk '{if(NR==1) printf "%10s %10s %10s %10s 。
%10s\n",$1,$2,$3,$4,"Total"} 。
NR>=2{total = $2 + $3 + $4 。
printf "%10s %10d %10d %10d %10.2f\n", $1, $2, $3, $4, total}' 。
你可以仔细的比对一下上面两个输入有啥不同~从中去了解两种语法吧! 我个人是比较倾向于使用第一种语法,因为会比较有统一性啊! ^_^ 。
最后此篇关于sed&awk基本使用方法的文章就讲到这里了,如果你想了解更多关于sed&awk基本使用方法的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我需要一些有关 Sed 的帮助。我在 Windows 和 Mac OSX 上使用它。我需要 Sed 添加一个 每 4 行,在第一个 之后找到,并在 上停止这样做 我就是找不到办法做到这一点。每
我是一个管理很多网站的轮换团队的一员,我们继承了一个网站的一些特别糟糕的代码,我们正在彻底重新设计该网站。非常可怕的是,开发服务器上有一些链接将您带到实时服务器和旧域以及许多其他可怕的事情。 我一直在
我正在尝试在脚本中运行以下表达式以查找设备并在html文件中更改与该设备关联的字段之一。 sed -e "s/$OLDTEST/$TESTING/" -e "s/$CURRENTVALU/$NEWST
我正在尝试使用 sed 删除所有出现的 #ifdef _WIN32 #endif #ifdef 和 #endif 之间存在的所有内容都是空行。我使用 sed 的经验有限,我已经阅读了一些关于多行功能的
以下命令是什么意思: sed -e '/SUBCKT\ REDBK128S4_LC/,/ENDS/ d' $1 什么,代表? 最佳答案 如果指定两个地址,则指定执行命令的行范围。在您的 sed表达
我需要使用sed注释匹配行和其后的4行的帮助。 在文本文件中。 我的文本文件是这样的: [myprocess-a] property1=1 property2=2 property3=3 proper
我想要一个sed命令来完成以下任务: $ sed s'/:/ /g' sed s'/=/ /g' 也就是说,我想写 sed s'// /g' 并用空格替换=和:。 最佳答案 sed s'/[:=]/
我想在大文件中每隔30行插入一个字符串。我正在使用mini-sed,它不支持〜(波浪号)范围运算符。我正在寻找仅sed的解决方案。 最佳答案 该线程是如何使事情过于复杂的另一个示例。应该这样做: se
有人可以帮我吗? grep " 287 " file.txt | grep "HI" | sed -i 's/HIS/HID/g' sed: no input files 也尝试过 xargs gre
这个问题已经有答案了: How can I replace each newline (\n) with a space using sed? (43 个回答) 已关闭2 年前。 如何使用 sed 命
我们需要屏蔽信用卡号。屏蔽除最后 4 位数字以外的所有数字。我正在尝试使用 SED。由于信用卡号长度从 12 位到 19 位不等,我正在尝试编写正则表达式。以下代码将收到字符串。如果它包含形式为“CA
例如: sed 's@/lib\(64\)\?\(32\)\?/ld@/tools&@g' abc.txt 's@' 、 '(' 、 '\?' 、'&' 和 '@' 等含义是什么? 如何找到最合适
我们有一个进程可以使用包含 sed 的文件更改管道输入的命令。 我需要用变量值替换输入中的占位符,例如在一个 -e我可以运行的命令类型; $ echo "Today is XX" | sed -e "
这个问题在这里已经有了答案: Using different delimiters in sed commands and range addresses (3 个答案) 关闭1 年前。 我想问 2
是的,我搜索了该网站,但我认为我没有看到任何东西可以专门解决我无法克服的非常(我想很简单)的问题。 我正在上 Linux 类(class),有人问我这个问题: Use the sed command
我有一个看起来像这样的文件路径列表 abc/def/ghi/jl/r1/r2 abc/def/ghi/jl/r9/r11 abc/nyc/ghi/jl/r3/r4/r5 abc/nyc/ghi/jl/
我在这个文件中有这个文本: test.php $databases = array ( 'default' => array ( 'default' => array (
让我们考虑一个包含以下语句的 SQL 文件作为输入(即 myTable.sql): EXECUTE IMMEDIATE 'CREATE OR REPLACE PUBLIC SYNONYM ' || m
好的,谷歌搜索几分钟后,这似乎是在每行输出前加上 sed 前缀的常规方法 但是我得到一个我不明白的错误。 这是什么意思,我该如何解决? $ sed 's/^/#/' test.txt sed: -e
我有以下文件列表: r1 r2 10 r11 r99 我正在尝试替换 ls 输出中文件名中 r 之后的所有数字 我要找的结果: rA rA rA rA rA 使用下面的 sed 命令我可以匹配
我是一名优秀的程序员,十分优秀!