awk && sed (1)====积累取ip以及sed 查找替换

简介:

(一)awk 和 sed 的相似点

(1)它们都使用相似的语法来调用。

(2)它们都是面向字符流的,都是从文本中一行一行的输入,并且将输入直接送到标准输出端

(3)它们都使用正则表达式进行模式匹配

(4)它们允许用户在脚本中指定指令


我可能写的不是很好,这是我写脚本经常用到的,我认为这种东西要想学好就的多想,然后慢慢积累,而且我个人的心得是更加注重从实例出发,有些东西你看到以后多想想,可能到后来你还会遇到一些很相似的东西,不知不觉就学会了。



(一)取ip,一定要注意观察我报错的地方

(1)最简单的方法

[root@localhost ding]# hostname -I   #建议man hostname

192.168.43.1             #如果有俩网卡就显示两个ip

一般思路:把这行取出,把ip切出

[root@localhost ding]# ifconfig eth0 | grep 't a' | awk -F '[: ]+' '{print $4}'

192.168.43.1  

 举例1

[root@localhost ding]# echo 1 2 3    4 | awk '{print $4}'

4

[root@localhost ding]# 

 举例2 

[root@localhost ding]# echo "1 2 3    4" | awk '/4/' #加上双引号当作一个整体的字符串

1 2 3    4

[root@localhost ding]# echo 1 2 3    4    #不加当作单个字符串

1 2 3 4

 举例3

[root@localhost ding]# echo "{a..z}"  #把{a-z}当作了一个整体

{a..z}

[root@localhost ding]# echo {a..z} | awk '{print $4}'   #打印a-z中每一个

d

[root@localhost ding]# echo {a..z} | awk '{print $14}'

n

                                       

  • 知识点:
    (1)awk 有一个选项叫-F 用来指定分割符(=刀),可以指定一个多个分割符,为了保证不出错建议必须用单引引起来。
    (2)当指定多个分割符时必须用'[ ]'里面来写要指定的分割符,而'+'表示匹配中括号里面的
    任意一个一次或多次
    (3)如果不指定默认以空白(不是空格)作为分割符,如举例1
    (4)后面的但引号里面可以加'pattion {action}',一定要注意观察特点action是必须要写在{  }里面的,而pattion 必须写在‘{  }’的外面,可以只写pattion 不写action,那么就默认打印$0,打印一行。也可以只写action不写pattion,例如举例2,可以打印指定的列
    (5) $0 打印一行  $1打印第一列 $2打印第二列

####  grep 't (空格)a' 表示过滤符合条件的特定某行,在ifconfig eth0 中只有一行是符合这个条件的,我这么写是有道理的,不能写成'a (空格)t ' 或 '[t (空格)a]',表达的意义完全不同

取出特定的某行,用grep是根据这行独特的特点取的,也可以用sed 或 awk

例如:

[root@localhost ding]# ifconfig eth0 | awk 'NR==2{print $0}'

          inet addr:192.168.43.1  Bcast:192.168.43.255  Mask:255.255.255.0

[root@localhost ding]# ifconfig eth0 | sed -n '2p'

          inet addr:192.168.43.1  Bcast:192.168.43.255  Mask:255.255.255.0

[root@localhost ding]# ifconfig eth0 |head -2 |tail -1

          inet addr:192.168.43.1  Bcast:192.168.43.255  Mask:255.255.255.0

举例1

[root@localhost ding]# cat 222

Ding Xue

Ding Xue

Dingxue

[root@localhost ding]# cat 222 | awk '{print NR}'

1

2

3

[root@localhost ding]# cat 222 | awk '{print NF}'

2

2

1

[root@localhost ding]# 

知识点:

AWK中的NR NF FNR

pattion  action 是什么意思呢?就是符合前面的条件,我要做一个后面的事。

这个地方怎么用语言来表达呢?

AWK 是一行一行读取,NR就是说我读取到了第几行,我就把读取到这行的行号给输出出来

NF 就是说我读取了一行,这一行有多少列,统计下输出出来

FNR 和 NR 相似用于两个文件才能看出区别。


取出一行的方法很多,有时候可能认为有一种方法取出来不就可以了吗?学习不在多还在精,一定要在一种问题上多思考思考。

[root@localhost ding]# ifconfig eth0 |head -2 |tail -1 |cut -d":" -f2 |cut -d" " -f1

192.168.43.1

举例1:

[root@localhost ding]# ifconfig eth0 | grep 't a' |cut -d"[: ]+" -f4

cut: 分界符必须是单个字符

请尝试执行"cut --help"来获取更多信息。

[root@localhost ding]# ifconfig eth0 | grep 't a' |cut -d":" -f4

255.255.255.0

[root@localhost ding]# echo 12345 |cut -c2

2

[root@localhost ding]# echo 12345 |cut -c2-5

2345

[root@localhost ding]# echo 12345 |cut -c-3

123

[root@localhost ding]# echo 12345 |cut -c3

3

 举例3

[root@localhost ding]# cat 333

123455555

1231

12355

1242

[root@localhost ding]# cat 333|cut -c1-3

123

123

123

124

[root@localhost ding]# cat 333|cut -c3

3

3

3

4

[root@localhost ding]# 

知识

cut :cut 其实挺常用,如果你不会文本处理三剑客,cut 就相当厉害了,我平时用最多的就是 -d

-f -c(最多,脚本用的比较多,也可能是我写的脚本比较怪,呵呵)

(1)cut 只能支持一个分割符,不支持正则,所以他不如三剑客强大

(2)-d 用来指定分割符,-f数字 用来说明你要取以分割符为单位的哪一列

(3)-c 是相对于连续不间断的字符串来说的,例如举例2

(4)这只是只有一行,如果有多行呢? 例如举例3

如果用sed取就是利用查找替换

[root@localhost ding]# ifconfig eth0 |head -2 |tail -1 |sed -n  's/^.*:\(.*\) Bc.*$/\1/p'

192.168.43.1 

[root@localhost ding]# ifconfig eth0 |sed -n '2p' |sed -n  's/^.*:\(.*\) Bc.*$/\1/p'

192.168.43.1 

[root@localhost ding]# ifconfig eth0 |sed -n  '2s/^.*:\(.*\) Bc.*$/\1/p'

192.168.43.1 

举例1

[root@localhost ding]# cat 222

Ding Xue

Ding Xue

Dingxue

[root@localhost ding]# cat 222 |sed -n '2p'      #观察

Ding Xue

[root@localhost ding]# cat 222 |sed  '2p'        #再观察

Ding Xue

Ding Xue

Ding Xue

Dingxue

[root@localhost ding]# 

知识点

(1)sed -n可以看下面的注释,举个例子 。通过上面的例子有没有领悟到什么,就是说用sed处理文本的时候‘数字p’打印原来文本加匹配文本都打印出来,-n (not),否定原来文本,所以就只把匹配的打印出来的,也可以记住这个固定格式。

(2)后面的一大串都是正则的东西应该系统性总结一下,先不写了在这里,内容太多。

例如:替换大小写,哈哈,试错是成长的阶梯,除了红色那个其他都是我打错的,不要注重我打对的结果,更要注重我打错的结果

[root@localhost 桌面]# echo ding xue |sed -r 's/([^ ]+)/&u/g'

dingu xueu

[root@localhost 桌面]# echo ding xue |sed -r 's/([^ ]+)/\&u/g'

&u &u

[root@localhost 桌面]# echo ding xue |sed -r 's/([^ ]+)/\u&/g'

Ding Xue

[root@localhost 桌面]# echo ding xue |sed -r 's/([^ ]+)/\u&/p'

Ding xue

Ding xue

[root@localhost 桌面]# echo ding xue |sed -nr 's/([^ ]+)/\u&/p'

Ding xue 

[root@localhost 桌面]# echo ding xue da mei nv |sed -nr 's/([^ ]+)/\u&/p'

Ding xue da mei nv

[root@localhost 桌面]# echo ding xue da mei nv |sed -nr 's/([^ ]+)/\u&/g'

[root@localhost 桌面]# echo ding xue da mei nv |sed -r 's/([^ ]+)/\u&/g'

Ding Xue Da Mei Nv


下面是我百度的一些常用选项:

sed是一个很好的文件处理工具,本身是一个管道命令,主要是以行为单位进行处理,可以将数据行进行替换、删除、新增、选取等特定工作,下面先了解一下sed的用法
sed命令行格式为:
         sed [-nefri] ‘command’ 输入文本        

常用选项:
        
-n∶使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN的资料一般都会被列出到萤幕上。但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来。
        -e∶直接在指令列模式上进行 sed 的动作编辑;
        -f∶直接将 sed 的动作写在一个档案内, -f filename 则可以执行 filename 内的sed 动作;
        -r∶sed 的动作支援的是延伸型正规表示法的语法。(预设是基础正规表示法语法)
        -i∶直接修改读取的档案内容,而不是由萤幕输出。       

常用命令:
        a   ∶新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
        c   ∶取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
        d   ∶删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
         i   ∶插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
         p  ∶列印,亦即将某个选择的资料印出。通常 p 会与参数 sed -n 一起运作~
         s  ∶取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g 就是啦!



本文转自 大雪儿 51CTO博客,原文链接:http://blog.51cto.com/dingxue/1969107,如需转载请自行联系原作者

相关文章
|
Perl
文本处理三剑客(grep、sed、awk)
文本处理三剑客(grep、sed、awk)
83 1
|
Linux Perl Unix
Linux命令之grep/sed/awk等行转列
行转列 样例文件如下 cat file.txt a b c d e f g h i cat file.txt |xargs -n1 xargs -n 1 < file.
3723 0
|
机器学习/深度学习 Shell Perl
|
Perl 机器学习/深度学习