注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

good luck guys

welcome

 
 
 

日志

 
 

grep、 sed、 find 、xargs、 gawk 输入输出,好用不好学的东西 - 闵行 - 51CTO技术博客  

2012-09-26 11:38:51|  分类: linux命令 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
grep、 sed、 find 、xargs、 gawk 输入输出,好用不好学的东西
2009-08-28 16:46:36
标签:职场 休闲
正则表达式
\< \>分别表示单词的开始和结束
ex: \<[Tt]om\> 以T或者t开头,om结尾的单词

正则表达式的元字符集:
1) ^行首 /^love/ 以love开头的行;
2) $行尾 /love$/ 以love结尾的行;
3) . /l..e/ 匹配所有这样的行,字母l后面紧跟任意两个字符然后是e的行
4) * 重复0次或者任意多次前面字符
5) [x-y] 字符范围
6) [^x-y] 排除字符范围
7) \ 转义字符
8) \< \> 界定单词的开头和结尾
9) \( \) 标记后面用到的匹配字符 \(love\)able \1er=loveable lover
10) x\{m,n\} 重复字符x至少m此,至多n次

---------------------------------------------------------------------------
---------------------------------------------------------------------------
grep家族

RE--regular expression; g: global; p: print

除了上面10种元字符集,grep还支持下面的RE
\w 字母或者数字
\W 非单词字符(标点符号)
+ 重复一个或者多个前面的字符
| 或 love(a:b)表示lovea或者lobeb
?单个字符

grep返回状态值($?) 0表示成功,1表示失败,2表示没有找到文件

rgrep递归访问目录树   A

---------------------------------------------------------------------------
ls -l |grep ^d 显示目录

grep -n -v -# -A# -B#
-i 不区分大小写
-n 显示匹配行和行号
-v只显示不匹配行
-#显示匹配行上下#行
-A#匹配行后面打印#行
-B#匹配行前面打印#行
-c 只输出匹配行的行数
-h 查询多文件的时候不显示匹配的文件名字
-l 查询多文件只显示匹配的文件名
-s 不显示错误信息

grep与正则表达式同用
grep "^[^abc]" *.f 提取行首不是abc的行  "^[    ]"
grep "[0-9]\{3\}[8]" *.f 提取类似xxx8的行,x表示任意数字  ?\{3\}
grep "a\{2\}" *.f 显示a至少出现两次的行,注意grep是以行处理单位的
grep -n "^$" file 列出空行的行号              "^$"

-E参数,可以使用"与"和"或"模式
grep -E "abc | def" *.f 显示包含abc或者def的行  "abc | def"

ex:
ls -l | grep "^$" 显示目录  ?
ls -l | grep "^d" 显示文件 no d
ls -l | grep "^d..x..x..x" 显示特定权限的目录  ??
ps aux | grep "httpd" |grep -v "grep"

---------------------------------------------------------------------------
---------------------------------------------------------------------------
**使用find和xargs

1. find pathname -options [-print -exec -ok]

-optinos
1)-name:按照文件名查找
find ~ -name "*.txt" -print    *.txt
find ~ -name "[a-z][0-9].txt" -print     非大写?

2)-perm:按照权限查找文件
find ~ -perm 755 -print 查找权限为755的文件
find ~ -perm 007 -print 查找o位置上具有7权限的文件   ??
find ~ -perm 4000 -print 查找具有suid的文件

3)-prune
不在当前目录下查找  ?

4)-user和-nouser
find ~ -user zhao -print 查找文件属主是zhao的文件
find ~ -nouser -print 查找文件属主已经被删除的文件

5)-group和-nogroup
find ~ -group zhao -print 查找文件群组是zhao的文件

6)按照时间
find ~ -mtime -5 -print 文件更改时间在5天内的文件 -5
find ~ -mtime +3 -print 文件更改时间在3天前的文件 +3
find ~ -newer file1 -print 查找比文件file1新的文件  -newer file1

7)按照类型查找
find ~ -type d -print 查找所有目录  -type d

8)按照大小
find ~ -size +1000000C -print 查找文件大小大于1000000字节(1M)的文件

9)查找位于本文件系统里面的文件
find / -name "*.txt" -mount -print

-exec,-ok:find命令对于匹配文件执行该参数所给出shell命令,相应命令形式为: 'command' {} \;
-ok 在执行命令前要确认
find ~ -type f -exec ls -l {} \;     ?
find / -name "*.log" -mtime +5 -ok rm {} \; 5天前,-ok 在执行命令前要确认
find . -name core -exec rm {} \;   shell命令 'command' {} \;

使用-x dev参数
防止find搜索其他分区

find . -size 0 -exec rm {} \;   -exec rm {} \;

删除尺寸为0的文件

2. xargs与-exec功能类似
find ~ -type f | xargs ls -l
find / -name "*.log" -type f -print| xargs grep -i DB0

find . -type f |xargs grep -i "Mary" 
在所有文件中检索字符串Mary  无论大小写

ls *~ |xargs rm -rf   管道执行
删除所有以~结尾的文件

---------------------------------------------------------------------------
---------------------------------------------------------------------------
SED:
=====
sed [options] sedcommand inputfile >outputfile
sed不接触初始输入文件,对其不做修改,若想保存改动,重要将输出重定向到一个文件即可


a\: 当前行后面加入一行或者文本
c\: 用信文本替换本行的文本
d: 删除一行
D: 删除模板块的第一行
i\: 在当前行上面插入文本
h: 拷贝模板块的内容到内存缓冲区
H: 追加模板块的内容到内存缓冲区
g: 获得内存缓冲区内容,并替换当前模板中的文本
G: 获得内存缓冲区内容,并追加到当前模版块文本的后面
n: 读取下一个输入行,用下一个命令处理新行而不是第一个命令
N: 追加下一个输入行到模版块后面,并在二者间插入一个新行,改变当前行的号码
p: 打印模板块的行
P: 打印模板块的地一行
q: 退出sed
r file: 从file中读行
!: 表示后面的命令对所有没有选中的行起作用
s/re/strint/: 用string替换正则表达式re
=: 打印当前行号
#command: 把注释扩展到下一个换行符号前
l 打印匹配行,包括显示控制符号

**替换标记
g: 行内全部替换
p: 打印行
w: 把行写入一个文件
x: 互换模板块和缓冲区中的文本
y: 把一个字符翻译成另外一个字符

**sed中元字符可以使用正则表达式中所有的
新加:
& 保存搜索字符 s/love/**&**/ 用**love**代替love

**sed定位文本的方式
x 行号
x-y 从x行到y行
/patern/ 查询包括patern的行
x,y! 不包括指定x-y行号的行

ex:
sed '/Tom/d' file
删除包含Tom的行;d: 删除一行


sed '/Tom/!d' file
删除所有不包含Tom的行;

sed -n /north/p' file
打印包含north的行;p: 打印模板块的行

sed ‘3d' file
删除第三行;

sed '3,$d' file
删除第三行到最后一行; 3,$d


sed -n 's/west/north/g' file
替换所有west为north;
s替换,g: 获得内存缓冲区内容,并替换当前模板中的文本  ?
sed -n 's/^west/north/p' file
一行的开头的west用north替换,并打印发生替换的行;

sed 's/[0-9][0-9]$/&.5/' file
所有以两个数字结尾的行,最后两个数字被他们自己替换并附加.5;& 保存搜索字符??

sed -n 's/\(Mar\)got/\1ianne/p' file
将Margot替换为Marianne,并打印发生替换的行;复杂
\( \) 标记后面用到的匹配字符 \(love\)able \1er=loveable lover

sed 's#abc#ABC#g' file
所有abc由ABC替换,(所有s后面紧跟的字符都被认为是新的分隔符);

sed '/west/,/east/p' file
打印包含west行和包含east行中间的所有行;?

sed '1,/east/s/$/**A**/' file
地一行和包含east行之间的所有行的行尾加上字符串**A**;

sed -e '1,3d' -e 's/aa/bb/' file
先删除1到3行,然后用bb替换aa;  -e?

sed '/Sam/r file1' file
将文件file1中的内容附加在包含Sam的行后面;r file: 从file中读行

sed '/Sam/w file1' file
将还有Sam行写入文件file1中;

sed '/^north /a\new line second line' file
所有以north加空格开头的行后面附加上两行文本,a\表示追加文本,\表示换行(tcsh中需要,bash中不需要);

sed '/^north/i\new line' file
在行首为north的行前面插入一个新行;i\: 在当前行上面插入文本

sed '/norht/{n; s/aa/bb/;}' file
首先匹配含有north的行,然后执行一组命令,n表示移到下一行,并用bb代替aa;

sed '1,3g/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/' file
将1到3行中的所有小写字母用大写字母替换;
g: 获得内存缓冲区内容,并替换当前模板中的文本

sed '/Lewis/{s/Lewis/bbb;q;}' file
首先找到匹配Lewis的行,然后用bbb代替Lewis,接着q退出seq;?

sed -e '/north/h' -e '$G' file
首先找到包含norht的行,h拷贝到内存缓冲区,然后到文件随后一行($),G附加在最后一行后面;

sed -e '/we/{h;d;}' -e '/ct/{G:}' file
查找包含we的行,拷贝并且删除他,然后查找包含ct的行,将拷贝内容附加到他后面;  G: 获得内存缓冲区内容,并追加到当前模版块文本的后面

sed -e '/north/h' -e '$g' file
首先找到包含norht的行,h拷贝到内存缓冲区,然后到文件随后一行并覆盖他;
g: 获得内存缓冲区内容,并替换当前模板中的文本

sed -n 'l' file
打印所有包含不能打印字符的行。l  ??

sed -n '/.*ing/p' file
显示含有以ing结尾单词的行; /.*ing/p

sed -n '/music/=' file
打印含有music的行号;

sed '^$d' file
删除空行

sed 's/^/abcd/g' file  g?
在行首填加abcd

sed 's/$/abcd/g' file
在行尾填加abcd

sed 's/rm$/played &/g' file
&表示在替换的时候保留被替换的词(rm--played rm)=>s/rm$/played &/

sed 's/^M//g' file
去掉行尾的^M (^M的输入,先按ctrl+v然后按enter即可即可)

---------------------------------------------------------------------------
---------------------------------------------------------------------------
gawk程序:
awk [-F 域分隔符] 'commands' inputfile

awk执行时,其域标志符为$1,$2,$3.........$n,$0表示所有的域

awk -v var=value 赋值给一个用户定义的变量

awk 'pattern' file
awk '{action}' file
awk 'pattern {action}' file

ex:

awk '{print $0}' file
打印所有的域
awk执行时,其域标志符为$1,$2,$3.........$n,$0表示所有的域

awk '/Mary/' file
打印包含file中包含Mary的行;
/Mary/ 查询包括Mary的行 ' '
awk '{print $1}' file
打印文件的第一列(第一个域);ok

awk '/Mary/ {print $1,$2}' file
打印文件file包含Mary的行的第一和第二个域;'/ / { }'

df | awk 'S4>75000'
打印可用空间大于75000的文件系统
第4项 为大小   ' '

date | awk '{print " month:", $2, "\n year:" $6}'
格式化date的输出;
2列 6列 ,month  year: 原样打出  " "              \n ?print

awk 'BEGIN{OFMT="%.2f"; print 1.25463}'
指定数字输出格式,小数点后面保留两位有效数(1.25);
不懂 ??

awk '/[ab]cdef/' file
打印匹配acdef或者bcdef的行;
/[ ]     / 任意singo

awk '{print NR, $0}' file
awk '{print $0, NR}' file
NR当前记录数,每处理一个记录NR就加1
上面的命令相当于在每一行后面加上一个行号;?
NF则记录每一行的域的个数;

awk -F '[ :\t]' '{print $0}' file
指定域分隔符为空格、:或者tab

awk '/^[A-Z][a-z]+/' file
打印所有以一个大写字母开头,然后是一个或者多个小写字母的行;
^行首

awk '$1~/[Bb]ill/' file
第一个域匹配Bill或者bill的行;
~//表示匹配正则表达式

awk '$1!~/ly$/' file
第一个域末尾不是ly的行; !~//表示不匹配正则表达式           $行尾/ly$/以ly结尾的行

awk '/^(No|no)/' file
打印行首为No或者no的行;      ^(No|no)        

awk 'BEGIN {print "file head \n"} {print $1 \t $4}' file
awk 'BEGIN {print "file head \n"} {print $1 \t $4}' file |tee out.file
打印文件的时候附加一个文件头

awk 'BEGIN {print "file head \n"} {print $1 \t $4} END {print "end of file"}' file
打印文件的时候附加一个文件头和文件尾

awk中使用正则表达式
awk '{if($1~/hello/) print $0}' file
如果域1中包含hello,就打印所有的域    
~//表示匹配正则表达式,!~//表示不匹配正则表达式

awk '{if($6<$7) print $0}' file
awk '{if($1=="abc") ($1="def") print $0}' file
awk '{if($1=="abc") {($1="def") print $0}}' file 只打印修改的部分 {    }


awk表达式:
<,<=,>,>=,==,!=,~,!~(匹配,不匹配)

awk ‘$3==5346' file
第三个域等于5346,就打印出该行;

awk '$3>5000 {print $1}' file
第三个域大于5000就打印该行第一个域

awk '{max={$1>$2}?$1:$2; print max}' file
如果第一个域大于第二个域,max=$1否则=$2,打印最大值 A

awk '{print ($1==11?"high\t" $2:"low\t" $2)}' file

&&逻辑和,||逻辑或,!逻辑非
awk '$2==$5 && $3>5' file

awk '/Tom/,/Jary/' file
Tom第一次出现和Jary第一次出现之间的所有行;

awk '/north/ {print $3+10}' file
包含north行的地三个域加10;

awk '$3=="aa" {$2="dd"; print $0}' file
将地三个域为aa的行的第二域变成dd,并打印该行;

**awk编程:
使用变量
awk '$1~/Tom/ {wage=$2+$3; print wage}' file   ~//表示匹配正则表达式

先扫描第一个域,如果匹配Tom,就将第二和第三域的总和赋值给变量wage并输出;

awk 'BEGIN{FS=":"; OFS="\t";ORS="\n\n"}{print $0}' file
处理文件前设置  ??
域分隔符(FS)为(:)
输出域分隔(OFS)为(\t)
输出记录分隔符(ORS)为(\n\n)

awk 'END{print "The number of record is:' NR}' file
处理完文件后执行END语句
输出总记录数

awk '/Mary/{count++} END{print "Mary was found" count "times"}' file
计数文件中Mary出现的次数;

**awk输入输出重定向

awk '$4>=70 {print $1, $2 >"outfile"}' file
结果重定向到文件outfile中

awk 'BEGIN{"date" |getline d; print d}'
将date结果输给getline函数,并打印      BEGIN{      }
(getline从标准输出,管道等获得输入)

awk 'BEGIN{"date" |getline d; split(d,mon); print mon[1] mon[2]}'
将date结果输给getline函数,slpit将d分解成数组,打印数组第2个变量
**split函数:split(string,array,field seperator)

awk 'BEGIN{while("ls"|getline) print}'
依次输出ls的每一项  ?

awk 'BEGIN{print "what is your name?"; getline name <"/dev/tty"} $1~name {print "Found" name "on line" NR "."} END{print "see you" name}' file
从标准输入设备输入姓名,然后在文件file的第一个域内匹配,并做相应输出 ??

awk 'BEGIN{while(getline <"/etc/passwd" >0) {lc++; print lc " " a}}'
awk 'BEGIN{while(getline a <"/etc/passwd" >0) {lc++; print lc}}'
如果文件不存在,getline返回-1
到达文件尾返回0
读到一行返回1
读取文件/etc/passwd,计数行数


**awk控制语句
if语句:
awk '{if($6>50) print $1 "too high"}' file
awk '{if($6>20 && $2<=50) {safe++; print safe}}' file
awk '{if($5>50}{x++; print x} else {y++;print y}' file

awk '{if($1~/peter/){next} else {print}}' file
如果第一个域包含peter,awk就忽略这一行,读取文件的下一行,脚本从头开始执行;

循环语句:
awk '{i=1; while(i<=NF) {print NF, $NF; i++}}' file
awk '{for(i=1;i<=NF;i++) print NF, $NF}' file
循环中可以使用break和continue终止或者回到循环开始处继续循环;

**awk数组:
awk 'BEGIN{x=1} {name[x++]=$2}; END{for(i=1;i<=NR;i++) print i,name[i]}' file
将文件file第二个域读入数组name中,并依次输出他们
awk '{id[NR]=$1}; END{for(i=1;i<=NR;i++) print i,id[i]}' file

awk '/^Tom/ {name[NR]=$2}; END{for (i in name) print i, name[i]}' file
读取行首为Tom的行的第二个域到数组name,最后输出name

数组下标可以使用字符串
/Tom/{count["Tom"]++}
/Mary/{count["Mary"]++}
awk '{count[$2]++}; END{for (name in count) print name, count[name]}' file

***awk的命令行参数
ARGC参数个数
ARGV参数列表(数组下标从0开始)

使用命令行参数的例子:
test.awk
BEGIN{FS=":"; >$1~name{print $0}

awk -f test.awk file "Tom"

***awk内建函数:
*sub,gsub: 替换函数
awk '{sub(/Mac/,"MacIntosh"); print}' file
用MacIntosh替换Mac

awk '{sub(/Mac/,"MacIntosh",$1); print}' file
第一个域内用MacIntosh替换Mac

*index子串位置
awk '{print index("hello","lo")}' file

字串长度
awk '{print length("hello")}' file

取子串:
awk '{print substr("hello",3,2)}' file
从地三个字符开始取子串,长度为2

改变大小写
awk 'BEGIN{print toupper("hello"), tolower("HELLO")}' file

***自定义函数
function funname(parameter,.....){
函数体


---------------------------------------------------------------------------
---------------------------------------------------------------------------
**输入与输出
1.
echo
\c 不换行
\n 换行
-e 当echo后面文字包括转义字符的时候要使用-e   ?
echo ''name? \c"
echo -e "\007 your home is $HOME, you are connect on `tty`"

2.
cat
cat file1 file2 file3 > file
cat -v file 显示文件,包括其中的控制符(-v)
cat -n file 为每一行编号
cat -b file 每个非空行编号
cat -T file 以^I显示tab

3.
管道 | 把一个命令的输出传递给另外一个命令为输入

ex:
ls | grep file.doc
查找文件file.doc

who | awk '{print $1 "\t" $2}' 只显示用户名和所在终端
df -h | awk '{print $1}' |grep -v "filesystem" (-v表示输出不包括filesystem的项目)
df -h | awk '{print $1}' |grep -v "filesystem" |sed 's/\/dev\///g' 显示设备的时候不显示/dev/

4.tee
who | tee who.txt 输出到屏幕的同时输出到文件
who | tee -a who.txt 附加在文件的后面

5.文件重定向
ls -l |grep ^d >file.out 所有目录名字重定向到一个文件

cat /etc/passwd | awk -F: '{print $1}' |sort >a.out (-F:指定分隔符为:) ?

cat >file.out << EOF 在输入内容的时候,当EOF单独出现在一行的时候表示文件输入到此结束

---------------------------------------------------------------------------
chmod [u g o a] [+ - =] [r w x s l] file
s:给文件属主和组set-ID
l:给文件加锁,使得其他的用户不能访问

*suid和guid
suid意味着如果某个用户对属于自己的shell脚本设置了这种权限,则其他用户在执行这个脚本时也具有其属主的相应权限。
设置suid,4xxx,设置guid,2xxx,两者同时设置,6xxx
要设置文件的suid和guid必须同时具有相应的执行权限,否则在相应的位置会出现S标识而不是s。

chown -R -h ower:group file
-h:表示只改变符号链接的属主不影响其所指向的目标文件

---------------------------------------------------------------------------
**自动ftp传输
lftp < file

$ cat file
open -u zhao,pass hostip
binary
cd dir
mget *


tcsh:
set prompt='[%n@%m %c]$' 用户名@主机名 当前目录名
bash:
export PS1="[\n@\h \w]$"
---------------------------------------------------------------------------
---------------------------------------------------------------------------
1.
man -k keyword
在man数据中查找关键词

2.
at now +3 hours
at> reboot
at> ctrl+D
3小时后reboot

3.
bc - 计算器
scale=3 设置小数点后数字为数
ibase=2 二进制运算

4.
ls -d dir
只显示目录而不显示其下面的文件。

5.
sync
更新superblock并把它写入硬盘

6.
scp user@host:/path/file1 user@host:/path/file
服务器间拷贝文件



引文来源  grep、 sed、 find 、xargs、 gawk 输入输出,好用不好学的东西 - 闵行 - 51CTO技术博客
  评论这张
 
阅读(992)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017