sed,awk命令
sed
原理: sed 是一种在线编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有 改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。
常用参数:-n :使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN 的数据一般都会被列出到终端上。但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来。
p :列印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行
d :删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
~s :取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g 就是啦!
-i :直接修改读取的文件内容,而不是输出到终端。</p> <p>动作说明: [n1[,n2]]function
n1, n2 :不见得会存在,一般代表『选择进行动作的行数』,举例来说,如果我的动作是需要在 10 到 20 行之间进行的,则『 10,20[动作行为] 』</p> <p>function:
举例说明:sed -n '/set/p' .vimrc //找到含有set字符串的行并列举出来
sed -n '5,7p' .vimrc //列出 vimrc 文件内的第 5-7 行
sed 's/要被取代的字串/新的字串/g' //无g只替代每行第一个,有g全部替代。
awk
原理: awk方法主要是对文本进行“列”的操作,这个对比一下sed和grep可能我们更容易理解一些,sed和grep主要是对文本进行“行”的操作,awk会把每一列都取一个名字,从第一列开始:分别为$1,$2...$n,好吧,这样就可以按照名字来分别操作列了。
awk工作流程是这样的:读入有'\n'换行符分割的一条记录,然后将记录按指定的域分隔符划分域,填充域,$0则表示所有域,$1表示第一个域,$n表示第n个域。默认域分隔符是"空白键" 或 "[tab]键",所以$1表示登录用户,$3表示登录用户ip,以此类推。awk是以文件的一行为处理单位的。awk每接收文件的一行,然后执行相应的命令,来处理文本。
基本结构:awk [-F] "field-operator" 'comand' inputfiles
用法1:命令行
awk [-F field-separator] 'commands' input-file(s)
//其中,commands 是真正awk命令,[-F域分隔符]是可选的。 input-file(s) 是待处理的文件。 在awk中,文件的每一行中,由域分隔符分开的每一项称为一个域。通常,在不指名-F域分隔符的情况下,默认的域分隔符是空格。
用例:
cat /etc/passwd |awk -F ':' '{print $1}' //每读入文件的一行,都执行相应的command,每行都用:做一个分割域。此命令是每行打印第一列。
搜索/etc/passwd有root关键字的所有行 : awk -F: '/root/' /etc/passwd
搜索支持正则,例如找root开头的: awk -F: '/^root/' /etc/passwd
搜索/etc/passwd有root关键字的所有行,并显示对应的shell awk -F: '/root/{print $7}' /etc/passwd
下面统计/etc/passwd的账户人数 : awk '{count++;print $0;} END{print "user count is ", count}' /etc/passwd
如果只是显示/etc/passwd的账户和账户对应的shell,而账户与shell之间以逗号分割,而且在所有行添加列名name,shell,在最后一行添加"blue,/bin/nosh"。
awk工作流程是这样的:先执行BEGIN,然后读取文件,读入有/n换行符分割的一条记录,然后将记录按指定的域分隔符划分域,填充域,$0则表示所有域,$1表示第一个域,$n表示第n个域,随后开始执行模 式所对应的动作action。接着开始读入第二条记录······直到所有的记录都读完,最后执行END操作
cat /etc/passwd |awk -F ':' 'BEGIN {print "name,shell"} {print $1","$7} END {print "blue,/bin/nosh"}'
grep:
参考:https://www.cnblogs.com/bruceChan0018/p/5977916.html
grep在服务端查询消息时经常会被使用到,这里总结几个常用,简单的命令,熟练掌握可以使查询更为高效。
基本格式:
grep [option] pattern file
几个重要的命令参数,这里不列举全部,只列举可能会常用的,便于快速查询:
除了不加任何参数表示搜索符合之后的样式的内容之外,剩下的参数:
-v --revert-match #显示不包含匹配文本的所有行。
-i --ignore-case #忽略字符大小写的差别。
-n --line-number #在显示符合样式的那一行之前,标示出该行的列数编号。
-c --count #计算符合样式的列数。
如果将grep与正则表达式结合,可以使得该工具变得更加强大,这里记录几个常用的正则表达式,可以和grep参数配合使用:
\< #锚定单词的开始
如:'\<grep'匹配包含以grep开头的单词的行。
\> #锚定单词的结束
如'grep\>'匹配包含以grep结尾的单词的行
^ #锚定行的开始
如:'^grep'匹配所有以grep开头的行。
$ #锚定行的结束
如:'grep$'匹配所有以grep结尾的行。
[] #匹配一个指定范围内的字符
如'[Gg]rep'匹配Grep和gre
head和tail使用:
查看文件内容的特殊方法
相信最基本的cat和less,more你已经很熟悉了,如果有特殊的要求呢:
1. 如果你只想看文件的前5行,可以使用head命令,如:
head -5 /etc/passwd
2. 如果你想查看文件的后10行,可以使用tail命令,如:
tail -10 /etc/passwd
tail -f /var/log/messages
参数-f使tail不停地去读最新的内容,这样有实时监视的效果

浙公网安备 33010602011771号