shell——grep,sed,awk

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_42948022/article/details/102570923

grep

-a: 以文本文件形式搜索
-c : 计算输出匹配到的行数count
-i : 不区分大小写ignore
-h : 查询多文件时不显示文件名
-l : 查询多文件时, 只输出包含匹配字符的文件名
-n : 显示匹配的行号及行line no
-o: 只显示匹配的内容only matching
-v : 显示不包含匹配文本的所有行invert matching
“.”:一定有一个任意字符
“[]”:一个文字字符域

例子:
a)ifconfig|grep –o inet
//只显示匹配的字符串
b)seq 1 20 |grep –m 5 –E ‘[0-9]{2}’
//输出匹配的前5个结果
c)seq 1 20 |grep –c  –E ‘[0-9]{2}’
//输出匹配的行数
d)grep –r ‘127.0.0.1’  /etc --include *.conf
//递归搜索/etc目录下包含ip的conf文件
e)seq41 43 |grep –E ‘4[12]’

题目
复制/etc/passwd到当前目录下,对passwd进行如下操作:
1.显示/etc/passwd中以sh结尾的行;
2.显示/etc/passwd文件中不以/bin/bash结尾的行
3.找出/etc/passwd中的两位或三位数
4.在/etc/passwd中取出默认shell为bash

awk

记录
	记录是单个的、连续长度的输入数据,是awk的操作对象。记录由记录分隔符限定,记录分隔符是一个字符串,并且定义为
RS变量。在缺省情况下,RS的值设置为换行符,所以awk的
缺省行为是将整行输入作为记录。
字段(域)
	将每个记录进一步分解为称作字段的单独的块。字段受字段分隔符FS限定。缺省的字段分隔符是任意数量的空白字符,包括制表符和空格字符。所以在缺省情况下,将输入行进一步分解为单独的单词(由空白字符分隔的任何字符组)
规则
	规则是一些模式,后面跟着由换行分隔的操作。当awk执行一条规则时,它在输入记录中搜索给定模式的匹配项,然后对这些记录执行给定的操作(可以在规则中省略模式或操作):/pattern/ { action }

在这里插入图片描述

语法格式
awk/gawk   ‘pattern   {action}’   filename
	awk/gawk扫描filename中的每一行,  对符合模式pattern
的行执行操作action。
	awk/gawk程序是由多个pattern与action所组成,action
写在{}中,一个pattern后面跟一个Action。
	Pattern(1){Action(1)}
	Pattern(2){Action(2)}
	Pattern(3){Action(3)}

内部变量
FS: 输入记录字段间的分隔符(默认是空格和制表符) 
RS:输入记录的分隔符(默认是NEWLINE) 
OFS:输出记录字段间的分隔符(默认是空格)
ORS:输出记录的分隔符(默认是NEWLINE) 
NR:当前行数
NF:当前记录字段数
ARGC:命令行参数个数ARGV:命令行参数数组


awk '{i = 1; while (i<NF) {print NF,$i,i++}}' test
awk –F: -v ‘OFS=**’ ‘{print $1,$5}’ /etc/passwd
在/etc/passwd文件匹配以冒号为记录字段分隔符,**为OFS输出记录字段分隔符。打印出第一个字段和第五个字段。
awk 'BEGIN{print ARGV[0]}'
结果:awk 
ps -e |  gawk '/ 05 /  {print "tty05: 
" $4, $1}'
查看5号终端上的用户现在在干什么及其PID
ps | gawk '{if(NR!=1)printf  "PID:%5d\t\t%s\n",$1,$4}'

sed

把当前处理的行存储在临时缓冲区中,用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。
指令形式:
	sed [options] 'command' file(s)
	sed 's/test/mytest/' sed.txt
脚本文件形式:
	sed [options] -f scriptfile file(s)
	sed -f cmd.sed test.txt

-e command,--expression=command
	允许执行多条命令编辑。
-n, --quiet, --silent
	取消默认输出。
-f, --filer=script-file
	引导sed脚本文件名
-i
	直接修改读取的档案内容,而不是由屏幕输出
-r
	支持扩展表达式
--help     
	显示帮助信息并退出
--version
	显示sed版本信息并退出

sed -e '1,2d' -e 's/test/check/' sed.txt
-e选项允许在同一行里执行多条命令。
第一条命令删除1至2行,第二条命令用check替换test。

sed -e '1,2d;s/test/check/' sed.txt

sed --expression='s/test/check/' --expression='/love/d' sed.txt
一个比-e更好的命令是--expression。它能给sed表达式赋值。

同一匹配模式使用多个命令
sed –n '/test/ {=;l}' sed.txt
使用{}可以执行多个命令,如果不加{},效果是不一样的
sed –n '/test/ =;l' sed.txt

a\在当前行后面加入一行文本。append
c\用新的文本改变本行的文本。change
d从模板块(Pattern space)位置删除行。delete
i\在当前行上面插入文本。insert
l列出非打印字符。list
p打印模板块的行。print
q退出Sed。quit
r  file从file中读行。read
w file写并追加模板块到file末尾。write
!表示后面的命令对所有没有被选定的行发生作用。
y表示把一个字符转换为另外的字符
=打印当前行号码。
s/re/string用string字符串替换正则表达式re匹配的字符串。

sed -n '2p' sed.txt
sed -n '1,3p' sed.txt
sed -n '/hello/p' sed.txt
sed -n '1,$p' sed.txt
sed -n '/hello/=' sed.txt
sed -n '1,$=' sed.txt

sed -n '/A\{4,\}/ p' sed.txt
sed -n '/.test/p' sed.txt
sed -n '/*test/p' sed.txt

sed 'y/abcd/ABCD/' sed.txt
第一个字符串(abcd)必须和第二个字符串(ABCD)长度相等

题目:
1.把Jon的名字改成Jonathan.
2.删除头三行
3.显示5-10行
4.删除包含Lane的行
5.把三个星号(***)添加到以Fred开头的行
6.用JOSE HAS RETIRED取代包含Jose的行
7.删除所有空白行

猜你喜欢

转载自blog.csdn.net/qq_42948022/article/details/102570923