shell 文本过滤

今天闲着没事,把以前写的shell再拿出来看好多都忘记了,于是自己用看了一边资料:
.表是单个字符
^一行的开始 ^d以开头的  ^..1 第三个为1的字符   ^字符要放在匹配的字符前面
$一行的末尾 ^$ 表示空行 ^.$匹配一行一个字符的  $字符要放在匹配的字符后面
*匹配任意个字符  包括0个字符
\可以屏蔽一个特殊的字符 \*\.pas 这里的*是特殊字符,这样就表示*.pas这个文件
逗号可以分割不同的匹配字符如[S,s]表示S或者s都可以
-表示一个范围,[1-9],[a-z],[A-Z]  [1-9 A-Z a-z]任意的字符或者数字
A\{2\}B 表示A出现了2次  AAB
A\{4,\}B 表示A至少出现4次 AAAAB,AAAAAB
A\{2,4\}B 表示A出现2-4次  AAB AAAB AAAAB
[0-9]\{3\}\.[0-9]\{3\}\.[0-9]\{3\}\.[0-9]\{3\}  0-999.0-999.0-999.0-999

查找文件的时候 find 用到的
find pathname -options [-print -exec -ok]

-name -perm 权限 -user -group -mtime -n +n  -atime -ctime 文件的时间 -size  -nogroup 无有效属组的文件/etc/group 下不存在 -nouser 无有效用户的文件/etc/passwd
-newer file1 !file 比文件一新但比文件2旧的文件 -type [bdcplf] 文件类型
find . -name "*.rep" -print 匹配了含有.rep的文件,-print 可以不用写
find . -name "[A-Z]*" -print 当前目录下以大写字母开头的
find . -perm 775 当前目录下以775权限的文件

-print 将查找到的文件输出到标准输出
-exec  command {} \
找到后执行一些shell命令
find . -type f -exec ls -l {} \ 查找到并且ls
find . -name "*.log" -mtime +5 -ok rm {} \ 查找5天以前的到并且rm  ok命令要求得到确认

xargs 和exec的区别 exec会发起多个进程,而xargs 只有一个进程减少系统资源的消耗
find . -prem -7 -print|xargs chmod o-w 
find . -prem -7 -print|xargs file 查看文件类型

grep 标准的,扩展的
grep [选项]基础正则表达式[文件]  正则表达式最好用“”括起来
-c 只输出有多少行匹配到了
-i 不区分匹配的大小写
-h 查询多文件时不显示文件名
-H 显示文件名
-l 查询多个文件时,只显示包含匹配字符的文件名
-n 显示匹配行和行信息
-s 不显示不存在的或无匹配的错误信息
-V 过滤掉表达式的部分

grep "^[^210]"  1.txt 非210开头的,2,1,0开头的行都被过滤掉 3-9开头的都可以显示出来
[[:upper:]] [A-Z]
[[:alnum:]] [A-Z0-9a-z]
[[:lower:]] [a-z]
[[:space:]] 空格或tab键
[[:digit:]] [0-9]
[[:alpha:]] [a-zA-Z]
grep "5[[:digit:]][[:digit:]]" 1.txt  500-599的匹配


awk
命名的方式:
awk [-F filed-spearator] 'commend' input-files
awk 脚本 :所有的命名都放在一个文件里面
awk命令插入一个单独的文件
awk -f awk-script-file input-file

默认的分割符为空格 -F : 以:为分割符  awk -F : '{print $1"\t"$4}' i.txt  print中是要用“”引起来字符串的
明白记录,分割,域。一条记录被分割就成了域 awk主要进行的操作就是对域进行操作 动作对数据进行处理 放在{}中内指明。一般用print,模式部分决定动作什么时候被触发
域:$0 $1...$n

awk  'BEGIN {ptint "IP                    date\n"} {print $1"\t"$4} END{print "end of report"} 1.txt
IP                    date
$1    $4
end of report
awk 中特殊的字符“+“”?“ 前者表示多个字符,后者表示一个字符 ~ 匹配 !~不匹配
cat i.txt|awk '$0 ~ /218.79.131.96/'
awk '$0 !~ /210.12.12.30/' i.txt
awk '{if($1=="210.12.12.30") print $0}' i.txt


sed 不对原有的文件操作,先拷贝一个副本,所有操作在副本上操作
sed
命令格式
sed 脚本 :sed 选项 输入文件
sed 脚本 输入文件 :sed 选项 -f sed脚本文件 输入文件
如果没有输入文件,它会从标准输入得到 :sed脚本文件 选项 输入文件
选项
-n 不打印没匹配到
-c 下一个命令是编辑命令
-f 如果正在调用sed脚本

sed '2p' i.txt        p就是打印
sed -n '2p' i.txt     第2行  不打印没匹配到的,只打印匹配到的
sed -n '1,2p' i.txt   打印2行
sed -n '/los/p' i.txt 匹配到los
sed -n '2,/los/p' i.txt 从第3行开始到匹配的los结束
sed -n '/^$/=' i.txt 打印出空行的行号
sed -n -e '/^$/p' -e '/^$/=' i.txt  不能同时用-e 区分
sed '/aaaio/a\shenz' i.txt 会在找到aaaio后追加一行写上shenz 要分两行进行书写
sed '/aaaio/i\shenz' i.txt 会在找到aaaio前追加一行写上shenz
sed '/aaaio/c\shenz  ddd' i.txt 会在找到aaaio 替换成shenz   ddd
sed '1,2d' i.txt 会把1,2行给删除掉
sed 's/shenz/shenzhen/g' i.txt  所有shenz的地方全部替换 不加g时只在当次替换
sed 's/shenz/& shenzhen /p' i.txt 匹配到了shenz以后加上shenzhen
sed 's/shenz/ shenzhen &/p' i.txt 匹配到了shenz之前加上shenzhen

猜你喜欢

转载自yinwxiang.iteye.com/blog/1262413
今日推荐