5_find grep sed awk 详解
find :查找文件系统中指定的文件。可以按文件名(-name) 权限(-perm) 归属人 查找。
find 要查找文件的路径 表达式
*通配符 可以添加在文件名的任意位置
常用的例子(具体可参照 find --help):
find . -name 1.txt 在当前目录以及子目录下查找文件 1.txt
find /tmp -name 1.txt 在/tmp目录以及子目录下查找文件 1.txt
find /bin/ -perm 4755 | xargs ls -al 管道符号的作用是把前面的输出结果作为后面的参数再去执行后面的部分。
find /tmp -name "1.txt " | -exec ls -l
find /tmp -name '*.txt' -exec ls -l {} \;
grep:是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。
grep [命令选项] 要查找的匹配模式 [要查找的文件名]
-c 显示每行的匹配次数
-i 不区分大小写
-n 显示出行号和行
-v没有匹配到的行输出来
-r 递归查找
-A 显示匹配行以及行以下3行 grep -A 3 root /etc/passwd
-B 显示匹配行以及行以上3行 grep -B 3 root /etc/passwd
-C 显示匹配行以及以下和以上3行 grep -C 3 root /etc/passwd
grep cams /root/1.txt 在1.txt文件中查找cams字符串
grep -r cams /root/cams 在/root/cams目录下及其子目录下的所有文件中查找cams字符串,并把匹配的行打印出来。
grep -A 1 'root' /etc/passwd
grep 除了能够查找文件外,还能够将任意输出流重定向到grep 进行查找:
ps aux | grep ora 查找进程名中包含ora的所有进程信息
sed :是一个很好的文件处理工具,本身是一个管道命令,主要是以行为单位进行处理,可以将数据进行替换、删除、新增、选取等特定工作。
sed 参数[-nefr] 动作 文件
参数:
-n :安静模式。只有经过sed特殊处理的那一行(或者动作)才会被列出来。
-f:直接将sed的动作写在一个文件内,-f filename ,则可以运行filename 内的sed动作。
-r:默认是基础正规表示法语法
-i :直接修改读取的文件内容,而不是输出到终端。
动作:
a:新增,a的后面可以接字符串,而这些字符串会在目前的下一行出现。
c:取代,c的后面可以接字符串。
d:删除,d的后面不接任何东西。
i:插入,i后面可以接字符串,这些字符串会在新的一行出现(目前的上一行)。
p:列印,将某个选择的数据打印出来,一般和sed -n结合
s:取代,可以直接取代,通常搭配正规表示法。例:1,20s/old/new/g 把第一行至第二十行的old替换为new ,g全部替换
常用例子,可以自行尝试以下语句具体是什么意思:
sed后面的动作,只能用单引号
nl /etc/passwd | sed '2,5d'
nl /etc/passwd | sed '2d'
nl /etc/passwd | sed '2,$d'
nl /etc/passwd | sed '2a drink tea '
nl /etc/passwd | sed '2i drink tea '
nl /etc/passwd | sed '2a Drink tea or \
drink beer ?'
nl /etc/passwd | sed '2,5c NO 2-5 number'
nl /etc/passwd | sed -n '5,7p'
nl /etc/passwd | sed -n '/root/p'
nl /etc/passwd | sed '/root/d'
nl /etc/passwd | sed -n '/root/{s/bash/blueshell/;p}'
nl /etc/passwd | sed -n '/bash/{s/bash/bashshell/;p;q}'
sed 's/要被取代的字符串/新的字串/g'
/sbin/ifconfig eth0 | grep 'inet addr'|sed 's/^.*addr://g'| sed 's/Bcast.*$//g'
/sbin/ifconfig eth0 | grep 'inet addr'|sed 's/^.*addr://g'
nl /etc/passwd | sed -e '3,$d' -e 's/bash/blueshell/'
awk:是一个强大的文本分析工具。通常awk是以文件的一行为单位处理的,awk每接收文件的一行,然后执行相应的命令,来处理文本。
有三种方式调用awk:
1.命令行方式(重点介绍)
2.shell脚本方式
3.将所有的awk命令插入一个单独文件,然后调用
具体实例:
1、last -n 5 | awk '{print $1}' 打印出前五行的第一列($0表示所有列,$表示第n列)
2、cat /etc/passwd | awk -F ':' '{print $1"\t"$7}'
只显示/etc/passwd 的第一和第七列,中间以tab键分隔。 -F 指定域分隔符为 ":" 。
3、cat /etc/passwd | awk -F ':' 'BEGIN {print "name,shell"} {print $1 ","$7} END {print "blue,/bin/nosh"}'
只显示/etc/passwd的账户和账户对应的shell,而账户与shell之间以逗号分隔,而且所有行 添加列名name,shell,在最后一行添加"blue,/bin/nosh"。
4、 awk -F: '/root/{print $7}' /etc/passwd
搜索/etc/passwd有root关键字的所有行,并显示对应的shell。
以下是awk编程,可以自定义变量,条件语句(从c语言借鉴来的),循环语句,数组。
5、awk '{count++;print $0;} END{print "user count is",count}' /etc/passwd
统计/etc/passwd 的账户人数
6、awk 'BEGIN {count=0;print "[start]user
count is ", count} {count=count+1;print $0;} END {print "[end] user
count is",count}' /etc/passwd
这个也是统计/etc/passwd 的账户人数
常用的也就这么多吧!写总结到这吧,以后发现了新大陆,再过来补充。
下面说一下sed和awk的区别:
awk是一种程序语言,对文档资料的处理具有很强的功能,awk擅长从格式化报文或一个大的文本中抽取数据。
sed是一个精简的、非交互式的编辑器,它能执行与编译vi相同的编辑任务。
总结:
1、如果文件是格式化的,即由分隔符分为多个域的,优先使用awk;
2、awk适合按列(域)操作,sed适合按行操作。
3、awk适合对文件的抽取整理,sed适合对文件的编辑。
注:sed和awk对文件的编辑并没有对文件本身改变,只是把输出的进行改变。