Linux学习四剑客awk、sed、find(locate)、grep实战讲解

find命令:

1. find (找文件)
根据 文件名 和 路径 查找文件 并执行 一些操作
find  路径  -name "文件名"
find /home/python/Desktop/ -name "1.txt"
find /home/python/Desktop/ -name "*.txt"
find /home/python/Desktop/ -name "*.txt" -type f 
(f ==> file, 找到的是 文件 类型)
-------------------------------------------------------------------------------------------------
find /home/python/Desktop/ -name "*.txt" -type d
 (d ==> dir, 找到的是 文件夹 类型)
 -------------------------------------------------------------------------------------------------
find /home/python/Desktop/ -name "*.txt" -type d -ctime -1
(ctime ==> changetime,-1 ==> 1天以内,+30 ==> 超过30天)
-------------------------------------------------------------------------------------------------
find /home/python/Desktop/ -name "*.txt" -type f -ctime -1 |xargs rm -rf {} \;
(xargs ==> 把前面的输出当做输入传给后面花括号, \; ==> 与find固定搭配
-------------------------------------------------------------------------------------------------
find /home/python/Desktop/ -name "*.txt" -type d -ctime -1 -exec cp -r {} ~/Desktop/test/ \;
find /home/python/Desktop/test -type d -exec chmod -R 755 {} \;
-exec ==> 执行某些操作)
-------------------------------------------------------------------------------------------------
find /home/python/Desktop/ -name "*.txt" -type f -ctime +30 -size +1k
(-size ==> 文件大小, +1k ==> 大于1k且k为小写,+1M ==> 大于1M且M为大写)

find . -iname "ab*" -type f -mtime -3 -size -1M -perm 755
  •    .          表示在当前目录下
  • -name     查找关键字
  • -iname    忽略大小写查找含有关键字的文件
  • -type      d目录  f文件   l  软链接  
  • "ab*"      *匹配一串字符  ?匹配一个字符
  • -size      +1M 表示大于1M的-1k  表示小于1k的文件
  • -perm  755  表示权限为755的文件
  • -mtime -3    modify time 修改时间在3天以内的。
find -name 'a.*' -o -name '12.*'
find -name 'a.*' -a -type f
  • -o 表示或者
  • -a 表示and
find . -name "*.txt" -type f -mtime -1 -size +5M -perm 644
find . -name "*.txt" |xargs rm -rf {} \;
find . -name "*.txt" -exec  rm -rf {} \;
  • |xargs  表示将前面命令获得的结果作为一个整体,放到后面的{}中去
  • -exec 将前面的结果作为后面的输入。
  • |xargs 可换成-exec ,-exec 可支持的操作范围更广(如:cp mv chmod chown)
  • |xargs 只支持 rm删除操作
  • 以后使用前面的命令结果,推荐只使用-exec 
  • ls -li   # 可以查看文件的id号

一旦执行了chmod 000 *  那么如何恢复权限呢?

find . -type f -exec chmod -R 644 {} \; #将当前目录下的所有文件的权限修改成664
find . -type d -exec chmod -R 755 {} \; #将当前目录下的所有目录的权限修改成755
find . -name "*.txt" -type f -mtime -1 -size +5M -exec mv {} /root/ \;

作用:把当前目录下以.txt结尾,并且修改时间在1天以内,文件大小大于5M的文件 移动到/root/目录去 

find . -name "*.txt" -type f -mtime -1 -size +5M -exec cp -r {} /root/ \;
find . -type f -name "*.log" -mtime +30 -exec rm -rf {} \;

删除当前目录下修改时间在30天以前的*.log文件

2. grep (找文件内容,行操作)


根据 字符串 查找文件内容 并执行 一些操作
grep -n --color '^hello' ~/Desktop/2.txt
(-n ==> 显示行数, -color ==> 显示颜色,  '^hello' ⇒ 查找的字符串, ^ ==>字符串开头,
$ ==> 字符串结尾,  ~/Desktop/2.txt ==> 查找的文件路径)
-------------------------------------------------------------------------------------------------
grep -v --color '^hello' ~/Desktop/2.txt | grep -v "^$"
(-v ==> 取反,不要以 hello 开头的内容, -v ”^$” ==> 去掉空行
-------------------------------------------------------------------------------------------------
 

egrep '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$' 2.txt 
egrep '([0-9]{1,3}\.){3}[0-9]{1,3}$' 2.txt 
('[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$' ==> 正则表达式匹配ip地址 xxx.xxx.xxx.xxx)

cat /etc/passwd

grep 命令用于查找文件中的内容。匹配文件中的内容
grep  -n --color "root" /etc/passwd

-n 表示查找的结果在passwd文件的 行号
--color  ==>为关键字加上颜色
/etc/passwd  这个文件
grep  -n --color "^root" /etc/passwd

^root 表示以root开头的行,文本后面出现root关键字没有用

grep  -n --color "root$" /etc/passwd
grep  -n --color "bash$" /etc/passwd

root$ 表示文本所在行以root结尾
bash$ 表示文本所在行以bash结尾

grep "#" /etc/passwd  #查找passwd文件中包含#的行
grep -v "#" /etc/passwd  #查找passwd文件中不包含#的行

-v  表示不包含
grep -v "#" /etc/passwd | grep -v "^$"   #查找passwd文件中不包含#的行,并去除空行

grep -v "^$"   表示不包含空行,即去除空行

  • "^$" 表示空行
  • ^ 以空格开头
  • $ 以空格结尾


grep -[acinv] '搜索的内容'  filename

  • -a 以文本文件方式搜索

  • -c 计算找到的符合行的次数

  • -i 忽略大小写

  • -n 顺便输出行号

  • -v 反向选择,即显示不包含匹配文本的所有行

  • -h 查询多文件时不显示文件名

  • -l查询多文件时只输出包含匹配字符的文件名

  • -s 不显示不存在或无匹配的错误信息

  • grep 命令加 -E 参数,这一扩展允许使用扩展模式匹配

  • grep -E  =  egrep


使用grep查找文件中的ip地址

grep --color "[0-9][0-9]"  test.txt   
"[0-9]"  表示0~9任意一个字符
"[0-9][0-9]" 两个连续数字
grep --color "[0-9]\{1,3}"  test.txt  #匹配1~3次


egrep --color "[0-9]\{1,3}\.[0-9]\{1,3}\.[0-9]\{1,3}\.[0-9]\{1,3}$"  test.txt 

[0-9]\{1,3}\. 表示以1~3位数字,并且后面有一个 .
\.   表示转义的.  一定要加上
[0-9]\{1,3}$   表示以1~3位数字结尾,如果是4位数字或以上就不行
[a-z] 表示一个字母


egrep --color "([0-9]\{1,3}\.){3}[0-9]\{1,3}$"  test.txt 
{} 表示匹配的的次数
([0-9]\{1,3}\.){3} 将前面的形式匹配3次

[^] 匹配一个不在指定范围内的字符 ex: '[^A-FH-Z]rep' 匹配不包含A-R和T-Z的一个字母开头,紧跟rep的行。

ls -l |grep '^a'通过管道过滤ls -l 输出的内容,只显示以a开头的行
grep 'test' aa bb cc 显示在aa,bb,cc文件中匹配test行
grep '[a-z]/{5/}'  aa显示所有包含每个字符串至少有5个连续小写字符的字符串的行

grep -c "48" test.txt 统计所有以"48"字符开头的行有多少
grep -i "May" test.txt 不区分大小写查找 "May"所有的行

grep -n "May" test.txt 显示行号
grep -v "48" test.txt 显示输出没有字符"48" 所有的行


([a-z]+[a-z0-9])      表示匹配任意一个字母 + 任意一个数字或字母
([a-z]+[a-z0-9]+)    这边的+号表示可以匹配多个

 

 

3. awk (找文件内容,列操作根据文件内容 做分割 添加字符串
awk '{print $2}' 2.txt 
('{print $2}' ==> 打印第2列,2.txt ==> 文件名)
awk '{print $NF}' 2.txt 
('{print $NF}' ==> 打印倒数第1列, NF指的是某行被分为NF列)
awk '{print $(NF-1)}' 2.txt
( '{print $(NF-1)}'  ==> 打印倒数第2列且(NF-1)不能为负数)
-------------------------------------------------------------------------------------------------
awk -F: '{print $1}' 2.txt  | head -5
(-F: ==> 以:分割         | head -5 ==> 取前5行)
-------------------------------------------------------------------------------------------------
awk -F: '{print $1":"$NF}' 2.txt
(":" ==> 添加冒号,双引号代表添加。" "==>"",双引号里面可以添加任何东西)
-------------------------------------------------------------------------------------------------
ifconfig | grep 'inet 地址' | grep -v '127.0.0.1' | awk '{print $2}' | awk -F: '{print $2}'| 
awk -F. '{print $1"-"$2"-"$3"-"$NF}'
(匹配ip地址,输出xxx-xxx-xxx-xxx)

awk 可以打印某一行或者某一列(列是以空格分隔的)
awk '{print $1}' test.txt      打印文件第一列

awk '{print $3}' test.txt      打印文件第3列
awk '{print $NF}' test.txt      打印文件倒数第1个域   NF 表示最后一个

awk '{print $(NF-1)}' test.txt      打印文件倒数第2个域

awk -F: '{print $1,$NF}'  /etc/passwd|head 5    打印前5行的第一列和最后一列

-F:  格式匹配,这样就可以不显示文本行中的 : 冒号了


awk -F: '{print $1":"$NF}'  /etc/passwd|head 5   在第一列与最后一列之间添加一个:冒号

awk -F: '{print $1" secret "$NF}'  /etc/passwd|head 5   在第一列与最后一列之间 多加一列  secret 
-F: 表示以:符号做分隔
192.168.1.68 将其转换成  192-168-1-68
ifconfig|grep "inet addr"|grep 192 |awk '{print $2}'

ifconfig|grep "inet addr"|grep -v "172.0.0.1|awk '{print $2}'|awk -F"addr:" '{print $2}'|awk -F. '{print $1"-"$2"-"$3"-"$4}'

修改主机的名称,可以通过下面的命令 

 

 


4. sed (找文件内容,行操作
替换字符串
sed 's/h/he/2' 2.txt 
(s ==> 替换, h ==> 原内容, he ==> 新内容,2  ==> 替换第2个 ,2.txt ==> 文件名)
sed 's/h/he/g' 2.txt
(g ==> 替换全部) 
-------------------------------------------------------------------------------------------------
sed 's/h/www.\/\/baidu.com/3' 2.txt 
(\/\/ ==> //不进行转义)
sed 's#h#www.//baidu.com#3' 2.txt
(# ==> 代替/,不用\标明不进行转义)
-------------------------------------------------------------------------------------------------
sed -i 's#h#he#3' 2.txt
(-i ==> 改变文件。没有的话,不改变文件)
 

猜你喜欢

转载自blog.csdn.net/usstmiracle/article/details/107272844