grep 精准过滤

[root@t0 test]# cat grep.txt
192.168.1.20
test01
192.168.1.2
test02
192.168.1.201
test03

有如上面的文件,我们准备过滤192.168.1.2这个字符串

[root@t0 test]# grep 192.168.1.2 grep.txt 
192.168.1.20
192.168.1.2
192.168.1.201

匹配出来的结果并不精确,那么如果我们想精确匹配的话

其实答案很简单,用grep –w "abc" 或者是grep "\<abc\>"都可以实现
-w, --word-regexp         强制 PATTERN 仅完全匹配字词
 
[root@t0 test]# grep -w 192.168.1.2 grep.txt 
192.168.1.2

 

 合并文本中的行

第一种:隔行合并

还是上面的文本grep.txt
[root@t0 test]# cat grep.txt
192.168.1.20
test01
192.168.1.2
test02
192.168.1.201
test03

要求将文本内容处理为:

[root@t0 test]# cat grep.txt
192.168.1.20    test01
192.168.1.2    test02
192.168.1.201    test03

(中间以制表符分隔)

方法一:

[root@t0 test]# sed -n '{N;s/\n/\t/p}' grep.txt 
192.168.1.20    test01
192.168.1.2    test02
192.168.1.201    test03

方法二:

[root@t0 test]# awk '{tmp=$0;getline;print tmp"\t"$0}' grep.txt 
192.168.1.20    test01
192.168.1.2    test02
192.168.1.201    test03

方法三: 借用一下宏录制功能, normal状态下 qaJjq 实现录制, 然后在合适的区域重复执行n遍,这里2遍即可,normal状态下2@a

方法四:命令状态下 :1,4g/^/ join  增加了g过滤后,合并变成了隔行处理

          替换所有的话就是 %g/^/ join

第二种:

多行合并成一行,即:
AAAAA
BBBBB
CCCCC

合并为:
AAAAA BBBBB CCCCC

方法1: normal状态下 3J 其中的3是范围,可以是书签或者搜索位置等方式实现,J为合并
注: 如果改为3gJ的话,则合并时各行没有空白AAAAABBBBBCCCCC, 下面方法类似,不再重复这两种合并方式的区别.

方法2: 命令状态下 :1,3 join   或 :1,3 j

方法3: 传统一点的,替换换行符的方式,为避免最后一行也被换掉,范围缩小了,命令状态下  :1,2s/\n/ /

 

 

sed在行首或者行尾添加内容

用sed命令在行首或行尾添加字符的命令有以下几种:

假设处理的文本为test.file

处理文本的一些小的技巧

在每行的头添加字符,比如"HEAD",命令如下:

sed 's/^/HEAD&/g' test.file

在每行的行尾添加字符,比如“TAIL”,命令如下:

sed 's/$/&TAIL/g' test.file

运行结果如下图:

处理文本的一些小的技巧

几点说明:

1."^"代表行首,"$"代表行尾

2.'s/$/&TAIL/g'中的字符g代表每行出现的字符全部替换,如果想在特定字符处添加,g就有用了,否则只会替换每行第一个,而不继续往后找了

例:

处理文本的一些小的技巧

3.如果想导出文件,在命令末尾加"> outfile_name";如果想在原文件上更改,添加选项"-i",如

处理文本的一些小的技巧

4.也可以把两条命令和在一起,在test.file的每一行的行头和行尾分别添加字符"HEAD"、“TAIL”,命令:sed '/./{s/^/HEAD&/;s/$/&TAIL/}' test.file

 

以上其实都还OK,昨天花太多时间,主要因为被处理的文件是用mysql从数据库提取的结果导出来的,别人给我之后我就直接处理,太脑残了= -我一直有点怀疑之所以结果不对,有可能是windows和linux换行的问题,可是因为对sed不熟,就一直在搞sed。。。。。。。

 

众所周知(= -),window和linux的回车换行之云云,如果你知道了,跳过这一段,不知道,读一下呗:

Unix系统里,每行结尾只有“<换行>”,即“\n”;Windows系统里面,每行结尾是“<换行><回 车>”,即“\n\r”。一个直接后果是,Unix系统下的文件在Windows里打开的话,所有文字会变成一行;而Windows里的文件在Unix下打开的话,在每行的结尾可能会多出一个^M符号。

 

好了,所以我的问题就出在被处理的文件的每行末尾都有^M符号,而这通常是看不出来的。可以用"cat -A test.file"命令查看。因此当我想在行尾添加字符的时候,它总是添加在行首且会覆盖掉原来行首的字符。

要把文件转换一下,有两种方法:

1.命令dos2unix test.file

2.去掉"\r" ,用命令sed -i 's/\r//' test.file

好了,这样处理完,就OK啦!!!

 

2、打印第几行到第几行之间

cat 1 | awk 'NR==2,NR==4{print}'

 

1.      匹配1到多个空格

 /\s\+


2.      替换一个或多个空格,替换为逗号,

:%s/\s\+/,/g


3.      替换一个或多个空格,替换为换行符

:%s/\s\+/\r/g


简单解释一下:
%s :在整个文件范围查找替换(或者使用1,$s 也是整个文件范围查找)
/ :分隔符
+ : +表示重复1次或多次,加在一起表示一个或多个空格。
\r :换行符
/g :全局替换

4.      删除文章中的空行

:g/^s*$/d


简单解释一下:
g :全区命令
/ :分隔符
^s*$ :匹配空行,其中^表示行首,s表示空字符,包括空格和制表符,*重复0到n个前面的字符,$表示行尾。连起来就是匹配只有空字符的行,也就是空行。
/d :删除该行

 sed匹配多行并替换其中的内容

 

sed -i '/aaa/{:a;n;s/123/xyz/g;/eee/!ba}' yourfile

 

如题:
aaa
123
123
123
123
123
eee
怎么匹配aaa~eee(开始结束字符串确定),然后替换123这样的

 

先匹配aaa,匹配到后执行大括号里的语句。

n 读取下一行

s/123/xyz/g  将123替换为xyz,全局替换,同一行中出现几次替换几次

:a 设定跳转标签a

/eee/!ba  若当前行匹配不上eee,则跳转到标签a处继续执行,构成一个循环。若匹配到eee,则退出循环,sed重新对读入的每行匹配aaa。

由于sed没有加-n静默选项,所以默认对每行数据处理后都打印。

 

其中:a和!ba中的a是可以随意改变的,其中的b是不可改变的.

 

 

 

[root@t0 test]# cat grep.txt
192.168.1.20
test01
192.168.1.2
test02
192.168.1.201
test03

有如上面的文件,我们准备过滤192.168.1.2这个字符串

[root@t0 test]# grep 192.168.1.2 grep.txt 
192.168.1.20
192.168.1.2
192.168.1.201

匹配出来的结果并不精确,那么如果我们想精确匹配的话

其实答案很简单,用grep –w "abc" 或者是grep "\<abc\>"都可以实现
-w, --word-regexp         强制 PATTERN 仅完全匹配字词
 
[root@t0 test]# grep -w 192.168.1.2 grep.txt 
192.168.1.2

 

 合并文本中的行

第一种:隔行合并

还是上面的文本grep.txt
[root@t0 test]# cat grep.txt
192.168.1.20
test01
192.168.1.2
test02
192.168.1.201
test03

要求将文本内容处理为:

[root@t0 test]# cat grep.txt
192.168.1.20    test01
192.168.1.2    test02
192.168.1.201    test03

(中间以制表符分隔)

方法一:

[root@t0 test]# sed -n '{N;s/\n/\t/p}' grep.txt 
192.168.1.20    test01
192.168.1.2    test02
192.168.1.201    test03

方法二:

[root@t0 test]# awk '{tmp=$0;getline;print tmp"\t"$0}' grep.txt 
192.168.1.20    test01
192.168.1.2    test02
192.168.1.201    test03

方法三: 借用一下宏录制功能, normal状态下 qaJjq 实现录制, 然后在合适的区域重复执行n遍,这里2遍即可,normal状态下2@a

方法四:命令状态下 :1,4g/^/ join  增加了g过滤后,合并变成了隔行处理

          替换所有的话就是 %g/^/ join

第二种:

多行合并成一行,即:
AAAAA
BBBBB
CCCCC

合并为:
AAAAA BBBBB CCCCC

方法1: normal状态下 3J 其中的3是范围,可以是书签或者搜索位置等方式实现,J为合并
注: 如果改为3gJ的话,则合并时各行没有空白AAAAABBBBBCCCCC, 下面方法类似,不再重复这两种合并方式的区别.

方法2: 命令状态下 :1,3 join   或 :1,3 j

方法3: 传统一点的,替换换行符的方式,为避免最后一行也被换掉,范围缩小了,命令状态下  :1,2s/\n/ /

 

 

sed在行首或者行尾添加内容

用sed命令在行首或行尾添加字符的命令有以下几种:

假设处理的文本为test.file

处理文本的一些小的技巧

在每行的头添加字符,比如"HEAD",命令如下:

sed 's/^/HEAD&/g' test.file

在每行的行尾添加字符,比如“TAIL”,命令如下:

sed 's/$/&TAIL/g' test.file

运行结果如下图:

处理文本的一些小的技巧

几点说明:

1."^"代表行首,"$"代表行尾

2.'s/$/&TAIL/g'中的字符g代表每行出现的字符全部替换,如果想在特定字符处添加,g就有用了,否则只会替换每行第一个,而不继续往后找了

例:

处理文本的一些小的技巧

3.如果想导出文件,在命令末尾加"> outfile_name";如果想在原文件上更改,添加选项"-i",如

处理文本的一些小的技巧

4.也可以把两条命令和在一起,在test.file的每一行的行头和行尾分别添加字符"HEAD"、“TAIL”,命令:sed '/./{s/^/HEAD&/;s/$/&TAIL/}' test.file

 

以上其实都还OK,昨天花太多时间,主要因为被处理的文件是用mysql从数据库提取的结果导出来的,别人给我之后我就直接处理,太脑残了= -我一直有点怀疑之所以结果不对,有可能是windows和linux换行的问题,可是因为对sed不熟,就一直在搞sed。。。。。。。

 

众所周知(= -),window和linux的回车换行之云云,如果你知道了,跳过这一段,不知道,读一下呗:

Unix系统里,每行结尾只有“<换行>”,即“\n”;Windows系统里面,每行结尾是“<换行><回 车>”,即“\n\r”。一个直接后果是,Unix系统下的文件在Windows里打开的话,所有文字会变成一行;而Windows里的文件在Unix下打开的话,在每行的结尾可能会多出一个^M符号。

 

好了,所以我的问题就出在被处理的文件的每行末尾都有^M符号,而这通常是看不出来的。可以用"cat -A test.file"命令查看。因此当我想在行尾添加字符的时候,它总是添加在行首且会覆盖掉原来行首的字符。

要把文件转换一下,有两种方法:

1.命令dos2unix test.file

2.去掉"\r" ,用命令sed -i 's/\r//' test.file

好了,这样处理完,就OK啦!!!

 

2、打印第几行到第几行之间

cat 1 | awk 'NR==2,NR==4{print}'

 

1.      匹配1到多个空格

 /\s\+


2.      替换一个或多个空格,替换为逗号,

:%s/\s\+/,/g


3.      替换一个或多个空格,替换为换行符

:%s/\s\+/\r/g


简单解释一下:
%s :在整个文件范围查找替换(或者使用1,$s 也是整个文件范围查找)
/ :分隔符
+ : +表示重复1次或多次,加在一起表示一个或多个空格。
\r :换行符
/g :全局替换

4.      删除文章中的空行

:g/^s*$/d


简单解释一下:
g :全区命令
/ :分隔符
^s*$ :匹配空行,其中^表示行首,s表示空字符,包括空格和制表符,*重复0到n个前面的字符,$表示行尾。连起来就是匹配只有空字符的行,也就是空行。
/d :删除该行

 sed匹配多行并替换其中的内容

 

sed -i '/aaa/{:a;n;s/123/xyz/g;/eee/!ba}' yourfile

 

如题:
aaa
123
123
123
123
123
eee
怎么匹配aaa~eee(开始结束字符串确定),然后替换123这样的

 

先匹配aaa,匹配到后执行大括号里的语句。

n 读取下一行

s/123/xyz/g  将123替换为xyz,全局替换,同一行中出现几次替换几次

:a 设定跳转标签a

/eee/!ba  若当前行匹配不上eee,则跳转到标签a处继续执行,构成一个循环。若匹配到eee,则退出循环,sed重新对读入的每行匹配aaa。

由于sed没有加-n静默选项,所以默认对每行数据处理后都打印。

 

其中:a和!ba中的a是可以随意改变的,其中的b是不可改变的.

 

 

 

方法三: 借用一下宏录制功能, normal状态下 qaJjq 实现录制, 然后在合适的区域重复执行n遍,这里2遍即可,normal状态下2@a

方法四:命令状态下 :1,4g/^/ join  增加了g过滤后,合并变成了隔行处理

          替换所有的话就是 %g/^/ join

第二种:

多行合并成一行,即:
AAAAA
BBBBB
CCCCC

合并为:
AAAAA BBBBB CCCCC

方法1: normal状态下 3J 其中的3是范围,可以是书签或者搜索位置等方式实现,J为合并
注: 如果改为3gJ的话,则合并时各行没有空白AAAAABBBBBCCCCC, 下面方法类似,不再重复这两种合并方式的区别.

方法2: 命令状态下 :1,3 join   或 :1,3 j

方法3: 传统一点的,替换换行符的方式,为避免最后一行也被换掉,范围缩小了,命令状态下  :1,2s/\n/ /

 

 

sed在行首或者行尾添加内容

用sed命令在行首或行尾添加字符的命令有以下几种:

假设处理的文本为test.file

处理文本的一些小的技巧

在每行的头添加字符,比如"HEAD",命令如下:

sed 's/^/HEAD&/g' test.file

在每行的行尾添加字符,比如“TAIL”,命令如下:

sed 's/$/&TAIL/g' test.file

运行结果如下图:

处理文本的一些小的技巧

几点说明:

1."^"代表行首,"$"代表行尾

2.'s/$/&TAIL/g'中的字符g代表每行出现的字符全部替换,如果想在特定字符处添加,g就有用了,否则只会替换每行第一个,而不继续往后找了

例:

处理文本的一些小的技巧

3.如果想导出文件,在命令末尾加"> outfile_name";如果想在原文件上更改,添加选项"-i",如

处理文本的一些小的技巧

4.也可以把两条命令和在一起,在test.file的每一行的行头和行尾分别添加字符"HEAD"、“TAIL”,命令:sed '/./{s/^/HEAD&/;s/$/&TAIL/}' test.file

 

以上其实都还OK,昨天花太多时间,主要因为被处理的文件是用mysql从数据库提取的结果导出来的,别人给我之后我就直接处理,太脑残了= -我一直有点怀疑之所以结果不对,有可能是windows和linux换行的问题,可是因为对sed不熟,就一直在搞sed。。。。。。。

 

众所周知(= -),window和linux的回车换行之云云,如果你知道了,跳过这一段,不知道,读一下呗:

Unix系统里,每行结尾只有“<换行>”,即“\n”;Windows系统里面,每行结尾是“<换行><回 车>”,即“\n\r”。一个直接后果是,Unix系统下的文件在Windows里打开的话,所有文字会变成一行;而Windows里的文件在Unix下打开的话,在每行的结尾可能会多出一个^M符号。

 

好了,所以我的问题就出在被处理的文件的每行末尾都有^M符号,而这通常是看不出来的。可以用"cat -A test.file"命令查看。因此当我想在行尾添加字符的时候,它总是添加在行首且会覆盖掉原来行首的字符。

要把文件转换一下,有两种方法:

1.命令dos2unix test.file

2.去掉"\r" ,用命令sed -i 's/\r//' test.file

好了,这样处理完,就OK啦!!!

 

2、打印第几行到第几行之间

cat 1 | awk 'NR==2,NR==4{print}'

 

1.      匹配1到多个空格

 /\s\+


2.      替换一个或多个空格,替换为逗号,

:%s/\s\+/,/g


3.      替换一个或多个空格,替换为换行符

:%s/\s\+/\r/g


简单解释一下:
%s :在整个文件范围查找替换(或者使用1,$s 也是整个文件范围查找)
/ :分隔符
+ : +表示重复1次或多次,加在一起表示一个或多个空格。
\r :换行符
/g :全局替换

4.      删除文章中的空行

:g/^s*$/d


简单解释一下:
g :全区命令
/ :分隔符
^s*$ :匹配空行,其中^表示行首,s表示空字符,包括空格和制表符,*重复0到n个前面的字符,$表示行尾。连起来就是匹配只有空字符的行,也就是空行。
/d :删除该行

 sed匹配多行并替换其中的内容

 

sed -i '/aaa/{:a;n;s/123/xyz/g;/eee/!ba}' yourfile

 

如题:
aaa
123
123
123
123
123
eee
怎么匹配aaa~eee(开始结束字符串确定),然后替换123这样的

 

先匹配aaa,匹配到后执行大括号里的语句。

n 读取下一行

s/123/xyz/g  将123替换为xyz,全局替换,同一行中出现几次替换几次

:a 设定跳转标签a

/eee/!ba  若当前行匹配不上eee,则跳转到标签a处继续执行,构成一个循环。若匹配到eee,则退出循环,sed重新对读入的每行匹配aaa。

由于sed没有加-n静默选项,所以默认对每行数据处理后都打印。

 

其中:a和!ba中的a是可以随意改变的,其中的b是不可改变的.

 

 

 

sed -i '/aaa/{:a;n;s/123/xyz/g;/eee/!ba}' yourfile

 

如题:
aaa
123
123
123
123
123
eee
怎么匹配aaa~eee(开始结束字符串确定),然后替换123这样的

 

先匹配aaa,匹配到后执行大括号里的语句。

n 读取下一行

s/123/xyz/g  将123替换为xyz,全局替换,同一行中出现几次替换几次

:a 设定跳转标签a

/eee/!ba  若当前行匹配不上eee,则跳转到标签a处继续执行,构成一个循环。若匹配到eee,则退出循环,sed重新对读入的每行匹配aaa。

由于sed没有加-n静默选项,所以默认对每行数据处理后都打印。

 

其中:a和!ba中的a是可以随意改变的,其中的b是不可改变的.

相关文章: