一、文件查找
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代表还原