Bootstrap

linux三剑客 grep;awk;sed

目录

sed

参数:

sed -i 直接对文件进行操作,不会在终端打印

 sed -e 对文件执行操作,并打印输出到控制台,-n可以取消打印输出

操作动作:

a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~

c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!

d :删除,因为是删除啊,所以 d 后面通常不接任何东东;

i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);

p :打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~

s :取代,可以直接进行取代

的工作哩!通常这个 s 的动作可以搭配正则表达式!例如 1,20s/old/new/g 就是啦

sed -n 取消自动打印,sed执行会自动在终端打印输出结果,-n可以取消打印

sed -f scriptfile 指定的文件中是sed编辑命令

awk

参数:

-F  使用指定的字符串分割

-v  使用变量

-f  执行文件,是awk编辑命令的文件

grep

常用选项:

-i:忽略大小写进行匹配。

-v:反向查找,只打印不匹配的行。

-n:显示匹配行的行号。

-r:递归查找子目录中的文件。

-l:只打印匹配的文件名。

-c:只打印匹配的行数。

grep,sed和awk都是读一行处理一行,直到处理完成。

sed

用于文本处理的流编辑器,加上正则表达式的支持,可以进行大量的复杂的文本编辑操作。

参数:

-i  ::  直接对源文件进行修改

-e ::  执行操作并打印输出到控制台,源文件不会修改

-n ::  执行操作取消打印输出到控制台  

-f  ::  执行sed编辑命令的文件

sed -i 直接对文件进行操作,不会在终端打印

[shuqiq@shuqiq mybash]$ cat sed.txt 
a
aa
aaa
bbbb
bbbbb
bbb
bb
b
0023 456
0023456
[shuqiq@shuqiq mybash]$ sed "s/00/1/" -i sed.txt 
[shuqiq@shuqiq mybash]$ cat sed.txt 
a
aa
aaa
bbbb
bbbbb
bbb
bb
b
123 456
123456

 sed -e 对文件执行操作,并打印输出到控制台,-n可以取消打印输出

操作动作:

  • a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~

##格式为:::  sed [option] '操作选项\字符串'
##或者:::    sed [option] '操作选项 字符串'
##每行后面追加字符串
[shuqiq@shuqiq mybash]$ sed -e "a\new line" sed.txt
a
new line
aa
new line
aaa
new line
bbbb
new line
bbbbb
new line
bbb
new line
bb
new line
b
new line
123 456
new line
123456
new line
##第n行后面追加字符串
[shuqiq@shuqiq mybash]$ sed -e "1a new line" sed.txt
a
new line
aa
aaa
bbbb
bbbbb
bbb
bb
b
123 456
123456
##第n到m行后面追加字符串
[shuqiq@shuqiq mybash]$ sed -e "1,3a\xxxx" sed.txt 
a
xxxx
aa
xxxx
aaa
xxxx
bbbb
bbbbb
bbb
bb
b
123 456
123456
##从n行到最后一行
[shuqiq@shuqiq mybash]$ sed '3,$a\xxx' sed.txt 
a
aa
aaa
xxx
bbbb
xxx
bbbbb
xxx
bbb
xxx
bb
xxx
b
xxx
123 456
xxx
123456
xxx


  • c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!

##格式为:::  sed [option] '操作选项\字符串'
##或者:::    sed [option] '操作选项 字符串'
##字符串取代n到m行
[shuqiq@shuqiq mybash]$ sed -e "1,3c\xxxx" sed.txt 
xxxx
bbbb
bbbbb
bbb
bb
b
123 456
123456
##字符串取代第n行
[shuqiq@shuqiq mybash]$ sed -e "3c\xxxx" sed.txt 
a
aa
xxxx
bbbb
bbbbb
bbb
bb
b
123 456
123456
##字符串取代所有行
[shuqiq@shuqiq mybash]$ sed -e "c\xxxx" sed.txt 
xxxx
xxxx
xxxx
xxxx
xxxx
xxxx
xxxx
xxxx
xxxx
xxxx
  • d :删除,因为是删除啊,所以 d 后面通常不接任何东东;


##删除掉最后n行
[shuqiq@shuqiq mybash]$ sed -e '3,$d' sed.txt 
a
aa
##删除掉第一行
[shuqiq@shuqiq mybash]$ sed -e "1d" sed.txt 
aa
aaa
bbbb
bbbbb
bbb
bb
b
123 456
123456
##删除掉 n至m行 
[shuqiq@shuqiq mybash]$ sed -e "1,3d" sed.txt 
bbbb
bbbbb
bbb
bb
b
123 456
123456
##删除掉空行
[shuqiq@shuqiq mybash]$ sed '/^ $/d' sed.txt 
a
aa
aaa
bbbb
bbbbb
bbb
bb
b
123 456
123456
  • i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);

##i与a相似只是,i在行前插入,a在行后插入
##格式为:::  sed [option] '操作选项\字符串'
##或者:::    sed [option] '操作选项 字符串'
##每行前面插入字符串
[shuqiq@shuqiq mybash]$ sed 'i\xxx' sed.txt 
xxx
a
xxx
aa
xxx
aaa
xxx
bbbb
xxx
bbbbb
xxx
bbb
xxx
bb
xxx
b
/xxx
123 456
/xxx
123456
##第n行前面插入字符串
[shuqiq@shuqiq mybash]$ sed '1i xxx' sed.txt 
xxx
a
aa
aaa
bbbb
bbbbb
bbb
bb
b
123 456
123456
##第n到m行的每一行前面插入字符串
[shuqiq@shuqiq mybash]$ sed '1,3i\xxx' sed.txt 
xxx
a
xxx
aa
xxx
aaa
bbbb
bbbbb
bbb
bb
b
123 456
123456
##第n行到最后一行的每一行之前插入字符串
[shuqiq@shuqiq mybash]$ sed '4,$i\xxx' sed.txt 
a
aa
aaa
xxx
bbbb
xxx
bbbbb
xxx
bbb
xxx
bb
xxx
b
xxx
123 456
xxx
123456
  • p :打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~

##打印结果
[shuqiq@shuqiq mybash]$ sed p sed.txt 
a
a
aa
aa
aaa
aaa
bbbb
bbbb
bbbbb
bbbbb
bbb
bbb
bb
bb
b
b
123 456
123 456
123456
123456
  • s :取代,可以直接进行取代

    的工作哩!通常这个 s 的动作可以搭配正则表达式!例如 1,20s/old/new/g 就是啦

##把每行的第一个ooo字符替换成bb字符
[shuqiq@shuqiq mybash]$ sed  -e "s/ooo/bb/" sed.txt 
a
aa
aaa
bbbb
bbbbb
bbb
bb
b
123 456
123456

##把每行的第一个bb字符替换成ooo字符,aa替换成xxx,多次执行用多个-e  
[shuqiq@shuqiq mybash]$  sed -e "s/aa/xxx/" -e "s/bb/ooo/" sed.txt
a
xxx
xxxa
ooobb
ooobbb
ooob
ooo
b
123 456
123456
##把每行的所有bb字符替换成ooo
[shuqiq@shuqiq mybash]$ sed 's/bb/ooo/g' sed.txt 
a
aa
aaa
oooooo
oooooob
ooob
ooo
b
123 456
123456

##把第n行到第m行的每一行的bb替换为ooo
[shuqiq@shuqiq mybash]$ sed '2,4s/bb/ooo/g' sed.txt 
a
aa
aaa
oooooo
bbbbb
bbb
bb
b
123 456
123456
##把第n行到最后一行的每一个bb替换为ooo
[shuqiq@shuqiq mybash]$ sed '1,$s/bb/ooo/g' sed.txt 
a
aa
aaa
oooooo
oooooob
ooob
ooo
b
123 456
123456


sed -n 取消自动打印,sed执行会自动在终端打印输出结果,-n可以取消打印

[shuqiq@shuqiq mybash]$  sed -n -e "s/ooo/bb/" sed.txt 
[shuqiq@shuqiq mybash]$ cat sed.txt 
a
aa
aaa
bbbb
bbbbb
bbb
bb
b
123 456
123456

sed -f scriptfile 指定的文件中是sed编辑命令

[shuqiq@shuqiq mybash]$ vi ll_sed.sh
[shuqiq@shuqiq mybash]$ cat ll_sed.sh
s/bb/ooo/g
[shuqiq@shuqiq mybash]$ sed -f ll_sed.sh sed.txt 
a
aa
aaa
oooooo
oooooob
ooob
ooo
b
123 456
123456

awk

用来处理文本,将文本按照指定的格式输出。其中包含了变量,循环以及数组

[shuqiq@shuqiq mybash]$ cat awk.txt 
1,2,3,4,5,6
aa aa aa aa aaa
bbb bb bbbb bb
ccc cc cc cc cc
d d d d d
1 2 3 4 5 6 7
a,b,c,d,e,f,g
##打印文件按空格或者tab分割的n到m列
[shuqiq@shuqiq mybash]$ awk  '{print $1,$2}' awk.txt 
1,2,3,4,5,6 
aa aa
bbb bb
ccc cc
d d
1 2
a,b,c,d,e,f,g 
##过滤出第n列符合布尔表达式的结果
[shuqiq@shuqiq mybash]$ awk '$1>2' awk.txt 
aa aa aa aa aaa
bbb bb bbbb bb
ccc cc cc cc cc
d d d d d
a,b,c,d,e,f,g

运算符描述
= += -= *= /= %= ^= **=赋值
?:C条件表达式
||逻辑或
&&逻辑与
~ 和 !~匹配正则表达式和不匹配正则表达式
< <= > >= != ==关系运算符
空格连接
+ -加,减
* / %乘,除与求余
+ - !一元加,减和逻辑非
^ ***求幂
++ --增加或减少,作为前缀或后缀
$字段引用
in数组成员

参数:

-F  使用指定的字符串分割

##使用指定字符分割取出n到m列
[shuqiq@shuqiq mybash]$ awk -F'b' '{print $1,$2}' awk.txt
1,2,3,4,5,6 
aa aa aa aa aaa 
 
ccc cc cc cc cc 
d d d d d 
1 2 3 4 5 6 7 
a, ,c,d,e,f,g

-v  使用变量

##使用变量
[shuqiq@shuqiq mybash]$ awk -v a=9 '{print $1+a,$2}' awk.txt
10 
9 aa
9 bb
9 cc
9 d
10 2
9 

-f  执行文件,是awk编辑命令的文件

grep

过滤

常用选项:

  • -i:忽略大小写进行匹配。

[shuqiq@shuqiq mybash]$ grep i -i 9_9_\*.sh 
#!/bin/bash
	for ((i=1;i<=j;i++));
		printf "$i x $j = $(($i*$j))\t";
	printf "\n"
  • -v:反向查找,只打印不匹配的行。

[shuqiq@shuqiq mybash]$ grep i -v 9_9_\*.sh 
for ((j=1;j<=9;j++));
do
	do
	done
done
  • -n:显示匹配行的行号。

[shuqiq@shuqiq mybash]$ grep i -n 9_9_\*.sh 
1:#!/bin/bash
4:	for ((i=1;i<=j;i++));
6:		printf "$i x $j = $(($i*$j))\t";
8:	printf "\n"
  • -r:递归查找子目录中的文件。

[shuqiq@shuqiq mybash]$ grep i -r ./
./if_compare_test.sh:#!/bin/bash
./if_compare_test.sh:#if test $1 -eq $2 ;then
./if_compare_test.sh:#elif test $1 -lt $2 ;then
./if_compare_test.sh:#fi
./if_compare_test.sh:#if test $1 -nt  $2 ;then
./if_compare_test.sh:#elif test $1 -ot $2 ;then
./if_compare_test.sh:#fi
./if_compare_test.sh:#if (($1>$2)) ;then
./if_compare_test.sh:#elif (($1<$2)) ;then
./if_compare_test.sh:#fi
./100_sum_oushu.sh:#!/bin/bash
./100_sum_oushu.sh:for i in `seq 2 2 100`;
  • -l:只打印匹配的文件名。

[shuqiq@shuqiq mybash]$ grep i -rl ./
./if_compare_test.sh
./100_sum_oushu.sh
./uninstall_mysql.sh
./installtomcat.sh
./installjdk.sh
./eof_test.sh
./100_sum_jishu.sh
./9_9_*.sh
./guess.sh
./hhh2.sh
./sum_100.sh
./wc_d.sh


 

  • -c:只打印匹配的行数。

[shuqiq@shuqiq mybash]$ grep i -c 9_9_\*.sh 
4

;