LINUX 下 find grep sed awk 的常见基本用法特点
只为让自己具有更高的水准,这就开始了长达6个月的小白进阶路!
这几天学习linux基础命令有点犯蒙,尤其是对文件查找这块。所有我想把一些我觉得常用的实用的参数项总结下来,大神勿喷哈。。。
不到之处请大家指教,小女子在此谢过了。
一、find:命令用于查找文件系统中指定的文件,其命令格式为:
1、find pathname -options [ -print -exec -ok ... ]
(1)find 命令的参数:
pathname:find命令所查找的目录路径。
-print:find命令将匹配的文件输出到标准输出。
-exec:find命令对匹配的文件执行该参数所给出的shell命令。相应命令的形式为‘command’{};,注意{ }和 ; 之间的空格。
-ok: 和-exec的作用相同,只不过以一种更为安全的模式来执行该参数所给出的shell命令,在执行每一个命令之前,都会给出提示,让用户来确定是否执行。
(2)查找规则:
-perm #按照权限查找
-name #按照文件名来查找(-name支持通配符或者’’)
-user #按照文件属主来查看文件
-group #按照文件的所属组来查看文件
-exec #查找后执行命令的时候不询问用户,直接执行
-type #根据文件类型查找文件(普通文件-f;目录文件-d;链接文件-l;块设备文件-b;字符设备文件-c;管道文件-p;socket文件-s)
eg.
find . -name 1.txt #在当前目录以及子目录下查找1.txt
find . -name “1.*”
find /tmp -name 1.txt #在/tmp目录下查找1.txt
find /tmp -type s
find /bin/ -perm 4755 | xargs ls -al (xargs 用来把前一个命令的输出结果转换为后一个命令的参数)
find /bin/ -exec 4755 | xargs ls -l {} \
二、grep:能使用正则表达式匹配文本,并把匹配的行打印
-c #只输出匹配行的次数
-r #查询目录及其子目录
-i #不区分大小写(只适用于单个字符)
-n #显示匹配出的载文件中是第几行
-v #显示不包含匹配文本的所有行
-n #显示匹配出的载文件中是第几行
--color=auto #找到的关键字加上颜色显示
-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 查找的字符串 文件
grep -r 查找的字符串 目录
(1)将/etc/passwd,高亮将出现 root 的行取出来,同时显示这些行在/etc/passwd的行号
# grep -n root /etc/passwd
(2)根据文件内容递归查找目录
# grep ‘ettercap’ * #在当前目录搜索带‘ettercap’行的文件
# grep -r ‘ettercap’ * ##在当前目录及其子目录下搜索‘energywise‘行的文件
# grep -l -r ‘ettercap’ * #在当前目录及其子目录下搜索‘ettercap‘行的文件,但是不显示匹配的行,只显示匹配的文件
(3)字符类的反向选择 [^]:如果想要搜索到有 cc 的行,但不想要 oo 前面有 g,如下grep -n‘[^a-z]oo‘ 2.txt
(4) grep -r cams /root/
(5)搜索以root开头的文件 ps aus | grep vi --color
(6)获取有数字的一行,如下grep -n‘[0-9]’ 2.txt
(7)找出空白行grep -n ‘^$’ 2.txt
三、sed:主要以行为单位进行处理,将数据增删改查选取等。。。
sed 参数[ -nefr ] 动作[ function ] 文件
1、选项与参数:
-n :使用安静模式。在一般sed用法中,所有来自STDIN的数据一般都会被列出到终端上。但是如果加上-n 参数后吗,则是只有sed特殊处理的那一行(或动作)才会被列出来。
-e :直接在指令模式上云行,sed动作的编辑;
-f :直接将sed的动作写在一个文件内,- f filename 则可以运行 filename 内的sed动作;
-r :sed的动作支持的是延伸正规表达发的语法。(默认是基础正则表示法语法);
-i :直接修改读取的文件内容,而不是输出到终端。
2、动作说明:[ n1[ ,n2 ] ] function
n1,n2 :不见得hi存在,一般代表【选择进行动作的行数】,举例来说,如果我的动作是需要在10到20行之间进行的,则【10,20[ function ]】
function:
a :新增,新增的内容在目前的下一行出现(目前的下一行);
c : 取代,c的后面可以接字串,这些字串可以取代n1,n2之间的行
d :删除,d的后面通常不接任何东西;
i : 插入,i的后面可以接字串,而这些字串会在新的一行出现(目前的上一行)
p :列印,即将某个选择的数据印出。通常p会与参数 sed -n 一起运行
s :取代,通常此动作可以搭配正则表达式
eg.
1)以行为单位的新增/删除 nl /etc/passwd | sed ‘2,5d‘
2)直要删除第二行 nl /etc/passwd | sed ‘2d‘
3)要删除第3到最后一行 nl /etc/passed | sed ‘3,$d‘
4)在第二行后(亦即是加在第三行)加上【drink tea】字样 nl /etc/passwd | sed ‘2a drink tea‘
5)新增两行以上的内容【drink tea......】与【drink beer?】 nl /etc/passwd | sed ‘2a drink tea......\>drink beer?‘
6)多点编辑,删除/etc/passwd第三行到末尾的数据,并把bash替换为blueshell
nl /etc/passwd | sed -e ‘3,$d‘ -e ‘s/bash/blueshell/‘
四、awk:简单来说,awk就是把文件逐行的读入,以空格为默认分隔符(-F)将每行切片,切开的部分在进行各种分析处理。
首先是让我迷惑很久的-F 分隔符的用法,其实就是类似于cat之类的操作:
例如操作data的文件:
zhc-123|zhang
hongchangfirst-99|zhang
hongchang-100|zhang
如果我们 awk -F ‘-‘ ‘{print $1;}‘ data,会打印出
zhc
hongzhangfirst
hongzhang
分隔符默认是空格,
变量名 含义
ARGC 命令行变元个数
ARGV 命令行变元数组
FILENAME 当前输入文件名
FNR 当前文件中的记录号
FS 输入域分隔符,默认为一个空格
RS 输入记录分隔符
NF 当前记录里域个数
NR 到目前为止记录数
OFS 输出域分隔符
ORS 输出记录分隔符
eg.last -n 5(仅取出前五行)
last -n 5 | awk ‘{print $1}‘ 仅显示最近登录的5个帐号
$0 表示所有域 $1表示第一个域 $n表示地n个域
(1)命令行方式--(重点介绍) awk [-F field-separator] ‘commands‘ input-file(s)
其中,commands是真正awk命令,[-F 域分隔符]是可选的。input-file(s)是待处理的文件
在awk中,文件的每一行中,由域分隔符分开的每一项称为一个域 。通常,在不指明-F 域分隔符的情况下,默认的域分隔符是空格。
(2)shell脚本方式
将所有的awk命令插入一个文件,并使awk程序可执行,然后awk明了解释器作为脚本的首行,一般通过键入脚本名称来调用。相当于shell脚本首行的:#!/bin/bash====>#!/bin/awk
(3)将所有的swk命令插入一个单独文件,然后调用:awk -f awk-script-file input-file(s)