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

(一)awk 和 sed 的相似点

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

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

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

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

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



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

(1)最简单的方法

[[email protected] ding]# hostname -I   #建议man hostname

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

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

[[email protected] ding]# ifconfig eth0 | grep ‘t a‘ | awk -F ‘[: ]+‘ ‘{print $4}‘

192.168.43.1

举例1

[[email protected] ding]# echo 1 2 3    4 | awk ‘{print $4}‘

4

[[email protected] ding]#

举例2

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

1 2 3    4

[[email protected] ding]# echo 1 2 3    4    #不加当作单个字符串

1 2 3 4

举例3

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

{a..z}

[[email protected] ding]# echo {a..z} | awk ‘{print $4}‘   #打印a-z中每一个

d

[[email protected] 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

例如:

[[email protected] ding]# ifconfig eth0 | awk ‘NR==2{print $0}‘

inet addr:192.168.43.1  Bcast:192.168.43.255  Mask:255.255.255.0

[[email protected] ding]# ifconfig eth0 | sed -n ‘2p‘

inet addr:192.168.43.1  Bcast:192.168.43.255  Mask:255.255.255.0

[[email protected] ding]# ifconfig eth0 |head -2 |tail -1

inet addr:192.168.43.1  Bcast:192.168.43.255  Mask:255.255.255.0

举例1

[[email protected] ding]# cat 222

Ding Xue

Ding Xue

Dingxue

[[email protected] ding]# cat 222 | awk ‘{print NR}‘

1

2

3

[[email protected] ding]# cat 222 | awk ‘{print NF}‘

2

2

1

[[email protected] ding]#


知识点:

AWK中的NR NF FNR

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

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

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

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

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

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

[[email protected] ding]# ifconfig eth0 |head -2 |tail -1 |cut -d":" -f2 |cut -d" " -f1

192.168.43.1

举例1:

[[email protected] ding]# ifconfig eth0 | grep ‘t a‘ |cut -d"[: ]+" -f4

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

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

[[email protected] ding]# ifconfig eth0 | grep ‘t a‘ |cut -d":" -f4

255.255.255.0

[[email protected] ding]# echo 12345 |cut -c2

2

[[email protected] ding]# echo 12345 |cut -c2-5

2345

[[email protected] ding]# echo 12345 |cut -c-3

123

[[email protected] ding]# echo 12345 |cut -c3

3

举例3

[[email protected] ding]# cat 333

123455555

1231

12355

1242

[[email protected] ding]# cat 333|cut -c1-3

123

123

123

124

[[email protected] ding]# cat 333|cut -c3

3

3

3

4

[[email protected] ding]#


知识点

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

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

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

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

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

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

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

[[email protected] ding]# ifconfig eth0 |head -2 |tail -1 |sed -n  ‘s/^.*:\(.*\) Bc.*$/\1/p‘

192.168.43.1

[[email protected] ding]# ifconfig eth0 |sed -n ‘2p‘ |sed -n  ‘s/^.*:\(.*\) Bc.*$/\1/p‘

192.168.43.1

[[email protected] ding]# ifconfig eth0 |sed -n  ‘2s/^.*:\(.*\) Bc.*$/\1/p‘

192.168.43.1

举例1

[[email protected] ding]# cat 222

Ding Xue

Ding Xue

Dingxue

[[email protected] ding]# cat 222 |sed -n ‘2p‘      #观察

Ding Xue

[[email protected] ding]# cat 222 |sed  ‘2p‘        #再观察

Ding Xue

Ding Xue

Ding Xue

Dingxue

[[email protected] ding]#


知识点:

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

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

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

[[email protected] 桌面]# echo ding xue |sed -r ‘s/([^ ]+)/&u/g‘

dingu xueu

[[email protected] 桌面]# echo ding xue |sed -r ‘s/([^ ]+)/\&u/g‘

&u &u

[[email protected] 桌面]# echo ding xue |sed -r ‘s/([^ ]+)/\u&/g‘

Ding Xue

[[email protected] 桌面]# echo ding xue |sed -r ‘s/([^ ]+)/\u&/p‘

Ding xue

Ding xue

[[email protected] 桌面]# echo ding xue |sed -nr ‘s/([^ ]+)/\u&/p‘

Ding xue

[[email protected] 桌面]# echo ding xue da mei nv |sed -nr ‘s/([^ ]+)/\u&/p‘

Ding xue da mei nv

[[email protected] 桌面]# echo ding xue da mei nv |sed -nr ‘s/([^ ]+)/\u&/g‘

[[email protected] 桌面]# 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 就是啦!

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

时间: 2024-10-26 19:45:39

awk && sed (1)====积累取ip以及sed 查找替换的相关文章

sed -反向引用取IP

sed 简单修改配置文件ip地址

sed -i 's/old ip/new ip/g' file.txt

linux取IP地址的多种方法

对于很多linux初学者,还有很多基础面试时,都会可能遇到需要提取IP地址的问题,下面我总结了多种取IP址的方法,希望大家能学到知识 如下图,我需要提取出eth0的IP地址 方法一:使用awk实现 ifconfig eth0 |grep "inet addr" |awk '{print $2}' | awk -F : '{print $2}' 参数说明: awk 默认以空格为分隔符 -F 指定分隔符 '{print $2}' 输出第二个参数 方法二:使用sed实现 [[email pr

linux下命令取IP地址的多种方法

经常会遇到在命令行取ip地址,或写脚本引用ip地址,需要使用命令取出来:下面的方法根据实际情况调整 下面的命令环境为centos6.6系统: [[email protected] ~]# ifconfig eth0 eth0      Link encap:Ethernet  HWaddr 00:0C:29:2A:03:61             inet addr:192.168.20.50  Bcast:192.168.20.255  Mask:255.255.255.0         

Linux系统下取IP地址的几种方法

Linux系统下取IP地址所在行的方法:(1).ifconfig eth0 | grep "inet addr"          inet addr:10.57.36.112  Bcast:10.57.36.255  Mask:255.255.255.0注释:grep过滤包含"inet addr"字符串的内容(2).ifconfig eth0 | sed -n '2p'          inet addr:10.57.36.112  Bcast:10.57.36

取ip,特殊命令和文件权限

取ip不低于3种方法 [[email protected] ~]# ifconfig eth0 |sed -nr '2s#^[^0-9]*([0-9.]*) .*$#\1#gp' 192.168.17.130 [[email protected] ~]# ifconfig eth0 |sed -n '2p'|awk -F "[ :]+" '{print $4}' 192.168.17.130 [[email protected] ~]# ifconfig eth0 |sed -n '2

linux正则表达式之取ip

使用ifconfig取出网卡eth0的ip地址 方法1:sed [[email protected] ~]# ifconfig eth0 |sed -nr'2s#.*dr:|Bca.*##gp' 10.0.0.200 [[email protected] ~]# 方法2:sed [[email protected] ~]# ifconfig eth0 |sed -nr'2s#.*dr:(.*)Bca.*#\1#gp' 10.0.0.200 [[email protected] ~]# 方法3:s

sed的增删改查、sed常见问题

作者:Georgekai 归档:学习笔记 2018/1/10 本章正题:sed的使用.sed常见问题 1.1 SED 1.1.1 sed是什么 :全称字符流编辑器Stream Edite 1.1.2 sed功能与版本: 1. 处理纯文本文件.日志.配置文件 2. 增删改查 3. 查看sed版本:sed --version 1.1.3 语法格式 1. sed  [选项]  [sed指令]  [输入文件] 2. sed -i.bak 's#oldboy#oldbgirl#g' oldboy.txt

sed for windows 双引号内部内容的替换

问题:最近需要编辑一些xml文件,需求是这样的,test.xml中有语句:name = “abc”,需要将其替换为name=("abc"). 在网上搜索到一些方法后决定用sed工具来实现,方法如下: 1.安装windows版本sed: 去sourceforge上下载sed.exe及其依赖库libiconv2.dll.libintl3.dll.regex2.dll放在同一目录 2.编辑sed脚本xml.sed,内容如下: s/name[ ]*=[ ]*/name=_(/g s/\((&q