0411正则之sed、awk

本文详细介绍sed与awk工具在Linux环境下进行文本处理的方法,包括行打印、字符替换、匹配模式、字段操作等核心功能,适合初学者快速掌握。

0411正则之sed、awk

一、sed工具的使用

sed及awk工具,能够把替换的文本输出到屏幕,sed与awk都是流式编辑器,是针对文本的行来操作的。

23808bc7ac73bcc1449f70d230e30ae3b69.jpg

1、打印某行或指定某几行或全部 命令格式为:sed -n ‘n’p filename

b3e08bf8aba8591f49abf7377aa8f09bf53.jpg

2、打印某一行并匹配带root字符的行(其余用法均与grep类似)

4ff24f2eff62c8ffae49a0ca8a83a54a784.jpg

3、匹配大写字母的字符使用字母“I”

40f684c88aa20e1450360382d7dd307e8f7.jpg

4、删除某些行

1124858f08abe31d1e32788e5a67c3eefec.jpg

将删除1-25行后的内容在屏幕显示,原文件内容不影响

9b7b8f6911b65ddf2624b152c299bba2146.jpg

删除原文件1-25行并在屏幕显示

58917a388a17fa0d13221e22d7203f3dd4a.jpg

5、替换字符或字符串

将前10行中bin替换为nib,s为执行替换串操作,g为全局替换

4e3ca31d9b0353fe7a19786564a9e75132a.jpg

6、调换位置

将第一段与最后一段替换位置,以:分隔,作为参考对象

c0372c2c8b813672f533bd49af714aec772.jpg

7、将/sbin/nologin替换为123

c63f9cc8ce4003c06c1b731cb0a4b306a59.jpg

或者

e63b657c23e358895eb87df4edce7130882.jpg

8、把文档中所有英文字母全部删除(即用空格代替)

0c6e20db62726f81b2d70e309d72dbac11c.jpg

9、将所有行行首加上固定字符串aaa:

1824884b498546d38b18959b6ba0c045383.jpg

二、awk工具的使用

f3e885bfa2e77279c4519a26442952896cb.jpg

1、-F指定分隔符‘:’将第一段打印出来,$1为第一段以此类推,不加-F默认以空格为分隔符。

d755fa785fd3d29e4773876e870bda7c073.jpg

b57c9eecc1874163307f0e4e631fdc9bb3f.jpg

打印多行

b57c9eecc1874163307f0e4e631fdc9bb3f.jpg

2、指定以#打印出分隔的内容

199b1d26ad021dc52772c7ef28ea750d570.jpg

3、匹配功能

把包含oo的行打印出来

fc9d04a1533bb748f164195ed012e3af300.jpg

只打印第一段包含oo的行(~即为匹配的意思)

e153aa1c99371d84ceab555b5a2394b104c.jpg

4、匹配包含root的第一段和第三段的内容,同时匹配包含user的第一段、第三段、第四段的内容,

dcc5962e99df58f2ccac1668d5fa8ca9cca.jpg

bb7b8368571c3aefe883dd38abd70b709f1.jpg

检查

d83350f7a4d2a43300a06bd7ce832bde7ca.jpg

5、打印第三段等于0的行,输出第一段的内容,或者打印第三段大于等于1000,输出全部行内容

59f4bcea366b748dc72e2f1ce5c2220cd1c.jpg

6、打印第七段不等于/sbin/nologin的行

0e4fbd548a7cb8d83115555251ec139ea5a.jpg

7、两个字段相互比较的需求

1e37b4ecbf91fd356c92f7bae2039ed4f36.jpg

打印第三段小于第四段的行

f5c8fdb9ef83e2c2224e4699af88d3863c9.jpg

打印第三段等于第四段的行

30817e51e31d8c1342779939af56b89ceca.jpg

8、打印第三段大于5,并且第三段小于7的行(&&为并且的意思)

5f172d933954bd1878f3b46743a34dac635.jpg

9、打印第三段大于1000或者第七段等于/sbin/nologin的行

011ea13256f6a40bfda7fa4164040102161.jpg

或者匹配第七段为bash的行

9d216a51d557853d2150f8f5b97fbb3cc9c.jpg

10、OFS用来指定print时用到的分隔符

打印出以#分隔符分隔的第三段大于1000或者第七段匹配为bash的行中的第一段、第三段、第七段的内容

caef2f7dde2334b4309f787e300069f98c0.jpg

加if与不加if的区别

a900b1c3cf5102544da7633b694b875c7ec.jpg

11、NR表示行,NF表示段,打印并显示行号

909adb2b80fdf6f27b0e41dce72b24c00a0.jpg

12、打印并显示段数

51f27c0055516f63c9ee295f5cbfc43a965.jpg

13、打印行数小于等于10的行

0bec1fbd88c89b54a37e65d9f32a586f4c2.jpg

14、打印行数小于等于10并且第一段包含/root或者snyc/的行

98778c7debb6205fd2a90a76f4031e25318.jpg

15、赋值前三行第一段值为root并打印

b2862b4b38db99a1af564b1f5f92fe31efe.jpg

16、打印前三行第一段字符串等于root的行

e5b08f63270a51a5a204f64fb5e8bd90c49.jpg

17、tot值从0开始循环将第三段的值相加,即第一行的第三段加第二行的第三段,依次叠加求和第三段的和。

d619fb25155b3919c8ffb943b6432a840b4.jpg

 

0411正则之sed、awk 课堂笔记

d3d62238abc074842171d3fbb78e33c1761.jpg

 

b239eb785c46ff846c3925e0311c38b50dc.jpg

 

f6ecaa992da1f7e0d0b12c6410291aa8572.jpg21d068433e1586fde80d7a152dfd6014f5e.jpg

3670aa50808ed16f972955d88c96a4dac76.jpg

96ec6ccf639166f65f78fc9b435233cd206.jpg

7fe77d966ab516ffc5037c5d29bf3ed0f5e.jpg

awk语法结构:

awk -F ':' 'BEGIN{语句} {if(条件){语句1;语句2;语句3} } END{语句}' filename

 

打印某行到某行之间的内容

sed -n '/tss/,/sas/p' /etc/passwd

 

sed转换大小写

1. 把每个单词的第一个小写字母变大写:

sed 's/\b[a-z]/\u&/g' filename

2. 把所有小写变大写:

sed 's/[a-z]/\u&/g' filename

3. 大写变小写:

sed 's/[A-Z]/\l&/g' filename

 

sed在某一行最后添加一个数字

sed -r 's/(^a.*)/\1 12/' test

sed -r 's/^a.*/& 12/' test

 

打印1到100行含某个字符串的行

sed -n '1,100{/abc/p}' 1.txt

 

awk 中使用外部shell变量

a=2; echo "a:b:c:d"|awk -F ":" -v get_a=$a '{print $get_a}'

 

awk 合并一个文件

 

awk 'NR==FNR {a[$1]=$2} NR>FNR {print $0,a[$1]}' 1.txt 2.txt

 

说明:

awk '{print NR,FNR}' 1.txt 2.txt //首先理解NR和FNR的不同(awk支持同时操作多个文件内容)

当NR==FNR其实就是第一个文件的内容

当NR>FNR,其实就是第二个文件的内容

 

把一个文件多行连接成一行

方法一:

a=`cat file`;echo $a

方法二:

awk '{printf("%s ",$0)}' file

方法三:

cat file |xargs

 

awk中gsub函数的使用

awk 'gsub(/www/,"abc")' /etc/passwd // passwd文件中把所有www替换为abc

awk -F ':' 'gsub(/www/,"abc",$1) {print $0}' /etc/passwd // 替换$1中的www为abc

 

awk 截取指定多个域为一行

用awk指定分隔符把文本分为若干段。如何把相同段的内容弄到一行?

以/etc/passwd为例,该文件以":"作为分隔符,分为了7段。

for i in `seq 1 7`

do

awk -F ':' -v a=$i '{printf $a " "}' /etc/passwd

echo

done

 

过滤两个或多个关键词

grep -E '123|abc' filename // 找出文件(filename)中包含123或者包含abc的行

egrep '123|abc' filename //用egrep同样可以实现

awk '/123|abc/' filename // awk 的实现方式

 

awk用print打印单引号

awk 'BEGIN{print "a'"'"'s"}'

awk 'BEGIN{print "a'\''s"}'

awk 'BEGIN{print "a\"s"}'

转载于:https://my.oschina.net/u/4095803/blog/3035939

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值