sed实战、find实战、grep实战
1.find实战
# 删除指定文件(三种方法) find /data/ -type f -name "*.log" -exec rm {} \; find /data/ -type f -name "*.log" | xargs rm -f rm -f `find /data/ -type f -name "*.log"` # 删除修改时间在30天之前的文件,+30:30天之前;30:第三十天;-30:最近30天 find /data/ -type f -name "*log" -mtime +30 | xargs rm -f # 查找/data目录下7天以前的,以log结尾的,大于1M的文件,移动到/tmp目录下 find /data/ -type f -name "*.log" -size +1M -mtime +7 -exec mv {} /tmp/ \; # 将某一目录下的所有目标文件,替换成指定内容,xargs的原理是将传过来的结果变成一行 find /data/ -type f -name "*.sh" | xargs sed -i "s#oldboy#oldgirl#g" sed -i"s#oldgirl#oldboy#g" `find /data/ -type f -name "*.sh"` # -a:并集;-o:交集 find /data/ -type f -name "test.sh" -o -name "hehe.sh" # 删除当前目录下除了oldgirl.txt的所有文件 find . -type f ! -name oldgirl.txt | xargs \rm -f # 找出当前目录下的所有一级目录 find . -maxdepth 1 -type d ! -name "." tree -d /data # 查看目录结构 tree -Ld 1 /data # 只看一级目录 # 这三个的inode是一样的,3指的是硬链接个数 ls -ldi /data/old/ /data/old/. /data/old/ett/..
2.grep实战
# grep限定单词边界 cat oldboy.txt oldboy hello word oldboy1 hello word # 打印符合条件的行,-n显示行号 grep -n "oldboy" oldboy.txt 1:oldboy hello word 2:oldboy1 hello word # 只匹配有这个单词的行 grep -n "\boldboy\b" oldboy.txt 1:oldboy hello word # -w参数是按单词搜索,只匹配有这个单词的行 grep -w "oldboy" oldboy.txt oldboy hello word
3.-e多点编辑
# 一条sed命令,删除/etc/passwd第三行到末尾的数据,并把bash替换为blueshell sed -e '3,$d' -e 's#bash#blueshell#' /etc/passwd # 用-e参数显示一下结果,然后用-i直接去修改 sed -i '3,$d;s#bash#blueshell#' passwd.txt # 利用sed将hehe.txt内每一行结尾的.则换成! sed -i 's#\.$#\!#g' hehe.txt sed -r 's#!$#.#g' hehe.txt # 利用 sed 直接在 hehe.txt 最后一行加入"# This is a test" sed -i '$a # This is a test' hehe.txt
4.删除第三行到末尾的行,并且将10修改为01(四种方法)
cat person.txt 101,oldboy,CEO 102,zhangyao,CTO 103,Alex,COO 104,yy,CFO 105,feixue,CIO 方法一:sed '3,$d' person.txt|sed 's#10#01#g' 方法二:sed -e '3,$d' -e 's#10#01#g' person.txt 方法三(此方法最常用):sed '3,$d;s#10#01#g' person.txt 方法四:sed -f person.sed person.txt cat person.sed 3,$d s#10#01#g
5.sed跟单引号、双引号的结合
cat test.txt a b a x=a y=b # 一个文本test.txt有三行内容;然后赋值变量:x=a、y=b,对文本进行内容替换 sed s#$x#$y#g test.txt # 相当于 sed "s#$x#$y#g" test.txt # 用单引号不行 sed 's#$x#$y#g' test.txt # eval可以先解析变量 eval sed 's#$x#$y#g' test.txt
6.sed处理开机自启服务
# 基础正则遇到括号需要转义,-r表示扩展正则; # grep -E参数相当于egrep,也是扩展正则的意思. chkconfig --list | grep 3:on | egrep -v "crond|sshd|network|rsyslog|sysstat" | awk '{print "chkconfig",$1,"off"}' | bash chkconfig --list | grep "3:on"|grep -vE "sshd|crond|network|rsyslog|sysstat"| awk '{print $1}'|sed -r 's#(^.*)#chkconfig \1 off#g'|bash
7.批量修改文件名
sed '1,3s#C#--&--#g' person.txt # 此处的&就是C,即 & 就是两个##之间匹配到的内容 touch stu_102999_{1..5}_finished.jpg ls *jpg | sed -r 's#(^.*)_finished.*#mv & \1.jpg#g' | bash # rename命令挺强大 rename "_102999" "hehe" *jpg
8.awk、sed取IP地址
# ^.*dr:匹配的是--以任意字符开头,到dr: # 两个空格B.*$,匹配到结尾,括号中的内容通过后向引用取到,即ip地址 ifconfig eth0 | sed -nr '/inet addr/s#^.*dr:(.*) B.*$#\1#gp' ifconfig eth0 | awk -F "[ :]+" 'NR==2{print $4}' # 删除空行(awk只是打印了空行行号) sed -i '/^$/d' oldboy.txt awk '/^$/ {print NR}' oldboy.txt
9.如何取得一个文件的权限数字,如:644
ls -l a.txt | cut -c2-10 | tr "rwx-" "4210" | awk -F "" '{print $1+$2+$3$4+$5+$6$7+$8+$9}' stat a.txt | sed -nr 's#^.*\(0(.*)/-.*$#\1#gp' # awk的分隔符一般是要取的那个元素的前后两个 stat a.txt | awk -F "[0/]" 'NR==4 {print$2}' stat -c %a a.txt
10.网站被攻击,所有文件都被加上了一行js,统一删除被加进去的内容
# 模拟环境 find . -type f | xargs sed -i '1 i <script>qweqweqwe</script>' # 一条命令修改内容,另一种方法:用备份去还原 find . -type f | xargs sed -ir 's#<script>.*</script>##g' # -n:不换行 echo -n "oldboy";echo "oldboy" # -e:支持转义 echo -ne "oldboy\t";echo "oldboy"