linux学习笔记:三剑客:grep+awk+sed;find和几种文件查找命令

一、文件查找

which,whereis,locate,find命令

1、which(寻找“执行文件”)

  • 这个命令默认是到PATH这个环境变量内查找“执行文件”的文件名
  • -a参数列出所有的值,不加只显示第一个符合的结果
  • 使用者的身份不一样,查询的结果也可能不一样,比如which ifconfig,用root查询得到结果,但用普通用户查询,不一定会查到,因为不一样的身份,PATH变量内容可能不一样
  • 所以内置变量不能用which查找路径,比如cd命令

2、whereis和locate

这两个命令查找速度比find快速,因为它们是在数据库中查找的,locate到/var/lib/mlocate数据库中查找的,所以执行此命令前最好更新数据库“updatedb”

  • whereis ifconfig #只要系统存在这个文件,不管什么身份都能查找到,因为不在PATH中查找了,而是在数据库中查找
  • whereis -m passwd #查询和passwd有关的“说明文件”文件名
  • locate passwd

3.find命令

与时间有关系的参数

  • atime:访问,读取过文件内容
  • ctime:文件权限被修改过
  • mtime:文件内容被修改过
    mtime参数:
    n:n天之前的“一天内”被修改过的文件
    +n:n天之前被修改过的文件(不含n天这一天)
    -n:n天到现在之内修改过的文件(包含n)
  • newerXY file/time:newer后面有两个占位符,它们的值可以是a、m、c、t分别代表上次访问时间、上次modify时间、上次change时间和绝对时间;find根据Y的值来计算file的某个时间戳,然后根据X的值来做匹配。

举例:(一个挑战题)

将实验楼实验环境中的 /etc 目录下的所有最后更新时间在2015年的文件拷贝到 /tmp 目录,需要保持目录结构。
例如 /etc/fstab 文件更新时间为2015年,则会被拷贝到 /tmp/etc/fstab 路径位置。

注意 /etc 目录下的子文件夹中也有很多文件最后更新时间在2015年,需要拷贝。如果只是文件夹的更新时间为2015年,则不需要拷贝文件夹。

目标:/etc 目录下所有最后更新时间在2015年的文件(不论 shiyanlou 用户是否对该文件具有访问权限)都被拷贝到 /tmp/etc 目录下。
拷贝完成后 /tmp/etc目录中只包含最后更新时间在2015年的文件。文件的路径需要保持目录结构。

第一种方法:

  • sudo find /etc -type f ! -newermt “2016-01-01” -newermt “2014-12-31” -exec cp –parents {} /tmp \;

newermt参数呀,我刚get到的,m指mtime,t☞时间;还有- -parents这个参数:复制时保持目录结构,,不知道这个参数你这题就歇菜啦啦~~~(唉,我就挂在这个参数好久呀!!) exec也说说吧,/tmp目录要放在{}后面哦,因为前面find的结果就放在{}位置

第二种方法:

sudo cp - -parents `sudo find -type f -mtime +610 -mtime -975` /tmp

嘿嘿,这个计算天数的傻方法才是我自己写的,不过好歹也挑战成功了(写这题的当前时间是2017.9.2)

  • find /home -user ywh
  • find / -nouser #不属于任何人的文件
  • find / -name passwd
  • find / -perm +7000 -exec ls -l {} \;#查找文件当中含有SGID或SUID或SBIT属性并使用ls -l 列出来
  • find /etc -size +50k -a -size -100k |xargs ls -l #找出/etc下面文件容量介于50kb到100kb之间的文件,并且将权限完整的列出来

文件查找命令就到这了,以后遇到再补充~~

二、grep高级用法(和正则表达式勾搭在一起来用)

三个基础参数:

-An:除了列出该行外,后面的n行也列出来
-Bn:除了列出改行,前面的n行也列出来
- -color=auto :选取出的数据列出颜色(这个挺好,方便你一眼看出来,嘿嘿~)
-c:计算查找字符串的次数
-n:列出行号
-v:反向查找
- i:忽略大小写

来一个参数大杂烩~

  • dmesg |grep -n -A3 -B2 –color=auto ‘eth’ #dmesg列出内核信息,显示内核信息中含有‘eth’的行,并显示本行的前两行及后三行
  • grep -n ‘ywh’ test
  • grep -nv ‘ywh’ test

正则:在grep中查找,正则表达式都得关在’‘号里面哟~

  • grep -n ‘te[sx]t’ test.txt #查找含test或text的行
  • grep -n ‘[^g]oo’ test.text #两个o前面只要不是g就行,但是两个o以上前面是g就ok哦
  • grep -n ‘^the’ test.text
  • grep -n ‘^[^a-zA-Z]’ test #开头不是英文字母,’^[^[:alpha:]]’也行
  • grep -n ‘o\{2,5\}’ test #这个有点不一样哦,{}在shell中有特殊的意义,所以必须用转义字符使其失去特殊意义 找出有2到5个o的行

来个挑战:排除文件中的空白行和注释行

  • grep -v ‘^$’ test |grep -v ‘^#’
  • egrep -v ‘^$|^#’ test #扩展正则表达式

查找/etc下含有星号的文件

  • grep ‘*’ $(find /etc -type f)
    当文件数量太多,用xargs将文件每次丢10行给grep处理
  • find / -type f |xargs -n 10 grep -l ‘*’ #-l参数只显示文件名

三、sed(管道命令,可以实现数据的增,删,替换,选取查看)

-r :支持扩展正则表达式
-i:直接修改文件的内容
a:新增
c:替换
d:删除
i:插入
p:打印
s:替换

实例:

  • nl /etc/passwd |sed ‘2,5d’ #删除2-5行
  • nl /etc/passwd |sed ‘5,$’ #删除5到最后一行
  • nl /etc/passwd |sed ‘2a ywh has lots of money’ #在第二行后添加ywh has lots of money 将a换成i,这句话则添加在第二行前面
  • nl /etc/passwd |sed ‘2,5c haha’ #将2~5行替换成haha
  • nl /etc/passwd |sed -n ‘5,7p’ #安静模式打印5-7行数据
    sed ‘s/要被替换的字符串/新的字符串/g’
  • /sbin/ifconfig eth0 |grep ‘inet addr’| sed ‘s/^.*addr://g’(经典案例,将sed替换,基本都会用这个例子,鸟哥书的p359)
    sed ‘s/#.*$//g’|sed ‘/^$/d’ #除掉注释和空白行
  • cat test | sed -e ‘4d’ -e ‘5c hahaha’ #sed后面要接两个以上的动作,每个都工作前要加-e参数

四、awk(好用的数据处理工具)

处理每一行的字段数据

  • last -n 5 #取出前5行登陆者数据
  • last -n 5 |awk ‘{print $1 “\t” $3}’ #取出第一列和第三列,中间以制表符隔开 $0代表一整行字段

awk的内置变量:

  • NF:每一行的字段总数
  • NR:目前处理的是第几行数据
  • FS:目前的分隔符

cat /etc/passwd |awk 'BEGIN {FS=":"} $3<10 {print $1 "\t" $3}'
#用   BEGIN默认读取第一行的时候,FS就生效

pay.txt文件内容
name 1st 2nd 3th
vb 2300 2466 2788
ab 2111 1111 1111
fg 2111 1110 8000
计算每个人的总金额,格式化输出

cat pay.txt|awk 'NR==1{printf "%10s %10s %10s %10s %10s\n”,$1,$2,$3,$4,”Total” }
NR>=2{total =$2+$3+$4
printf “%10s %10d %10d %10d %10.2f\n”,$1,$2,$3,$4,total}’

awk在{}中的动作,需要多个命令时,可用分号”;“间隔,或者直接以[Enter]键隔开每个命令

五、文件比较(diff)

diff:通常用于同一文件新旧版本的比较上

  • diff passwd.old passwd.new

将passwd.old 与passwd.new制作补丁文件

  • diff -Naur passwd.old passwd.new >passwd.patch
  • patch -pN < patch_file #更新
  • patch -R -pN < patch_file #还原
    新旧版数据和patch文件在一个目录就用p0,-R代表还原
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值