Fork me on GitHub

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"

 

posted @ 2018-10-14 22:28  法外狂徒  阅读(352)  评论(0编辑  收藏  举报