只是简单的学习下:
grep、sed、awk
1.grep 命令;打印文件中匹配某个样式的行
执行方式:grep 【options】pattern 【files】
控制样式的选项:
-E:扩展的grep, egrep
-f regex-file:从文件中获取正则表达式, fgrep
-i不区分大小写
-v:只取不匹配的结果
控制输出的选项:
-c:只输出文件中匹配的行数
-l:只输出内容匹配的文件名
-L:与-l相反, 输出内容没有匹配的文件名
-m num:找到num个匹配行就停止继续查找
输出行行首格式选项:
-n:显示输出行在文件中的行数
-h:不输出文件名
-H:输出文件名
示例:
$ cat test_file
just one line here.
Tiger cheng
$ grep -i '^tiger' test_file
Tiger cheng
$ grep -nH '^Tiger' test_file
test_file:2:Tiger cheng
/***************************************************************************************************/
sed: 一个用于过滤和转换文字的流编辑器
常用执行方式:sed 【options】 'command' [filename]
示例:
单次替换:'s/src/target'
$ echo "tiger's home is home01" | sed 's/home/Home/'
tiger's Home is home01
全局替换:'s/src/target/g'
echo "tiger's home is home01" | sed 's/home/Home/g'
tiger's Home is Home01
多次操作:-e选项
$ echo "tiger's home" | sed -e 's/tiger/Tiger/' -e 's/home/Home/'
Tiger's Home
在匹配的样式行进行替换:'/pattern/' s/src/target
原文内容;
$ cat sample_one
one 1
two 1
three 1
one 1
two 1
two 1
three 1
#将含有two字符串的行中的1改为2
$ sed '/two/ s/1/2/' sample_one
one 1
two 2
three 1
one 1
two 2
two 2
three 1
#将含有two字符串的行中的1改为2
#将含有three字符串的行中的1改为3
$ sed '
/two/ s/1/2/
/three/ s/1/3/' sample_one
one 1
two 2
three 3
one 1
two 2
two 2
three 3
从文件中读取替换规则
$ cat sed.list
/two/ s/1/2/
/three/ s/1/3/
$ sed -f sed.list sample_one
#注意 -f选项
one 1
two 2
three 3
one 1
two 2
two 2
three 3
指定范围
'n,m s/src/target' (n,m为行号)
'/pattern/, /pattern/ s/src/target'
#该第5-6行中的1为2
$ sed '5,6 s/1/2/' sample_one
one 1
two 1
three 1
one 1
two 2
two 2
three 1
#该第1个含有two的行到第6行
$ sed '/two/,6 s/1/2/' sample_one
one 1
two 2
three 2
one 2
two 2
two 2
three 1
删除行:d表示删除, !d表示不删除
#删除行中含有two的行
$ sed '/two/ d' sample_one
one 1
three 1
one 1
three 1
#不删除包含two的行
$ sed '/two/ !d' sample_one
two 1
two 1
two 1
添加或插入文本
#在第3行后追加一些文本:
$ sed '3a\
> hello world' sample_one
one 1
two 1
three 1
hello world
one 1
two 1
two 1
three 1
#在第三行前插入一些文本
$ sed '3i\
> hello world123' sample_one
one 1
two 1
hello world123
three 1
one 1
two 1
two 1
three 1
读写文件
#将处理后的文件结果保存到sample_one
$ sed '
> /two/ s/1/2/
> /three/ s/1/3/
> 1,3 w sample_three' sample_one
one 1
two 2
three 3
one 1
two 2
two 2
three 3
提前退出:
$ sed '
> /two/ s/1/2/
> /three/ s/1/3/
> 5q' sample_one
one 1
two 2
three 3
one 1
two 2
/*****************************************************************************************************/
awk:样式扫描和文本处理语言
执行方式: awk '{pattern + action}' filenames
示例:
示例文件emp_names内容;
$ cat emp_names
46012 DULANEY EVAN MOBILE AL
46013 DURHAM JEFF MOBILE AL
46015 STEEN BILL MOBILE AL
46017 FELDMAN EVAN MOBILE AL
46018 SWIM STEVE UNKNOWN AL
46019 BOGUE ROBERT PHOENIX AZ
46021 JUNE MICAH PHOENIX AZ
46022 KANE SHERYL UNKNOWN AR
46024 WOOD WILLIAM MUNCIE IN
46026 FERGUS SARAH MUNCIE IN
46027 BUCK SARAH MUNCIE IN
46029 TUTTLE BOB MUNCIE IN
打印一个或多个字段
$ awk '{print $1, $2, $3, $5}' emp_names
46017 FELDMAN EVAN AL
46018 SWIM STEVE AL
46019 BOGUE ROBERT AZ
......
样式匹配
$ awk '/AL/ {print $3, $2}' emp_names
EVAN DULANEY
JEFF DURHAM
BILL STEEN
EVAN FELDMAN
STEVE SWIM
#不指定字段就打印所有字段
$ awk '/AL/' emp_names
46012 DULANEY EVAN MOBILE AL
46013 DURHAM JEFF MOBILE AL
46015 STEEN BILL MOBILE AL
46017 FELDMAN EVAN MOBILE AL
46018 SWIM STEVE UNKNOWN AL
$awk '/AL|IN/' emp_names
46012 DULANEY EVAN MOBILE AL
46013 DURHAM JEFF MOBILE AL
....
46018 SWIM STEVE UNKNOWN AL
46024 WOOD WILLIAM MUNCIE IN
....
更精确的匹配
#注意结果,在一行中的任意字段匹配到AR
$ awk '/AR/' emp_names
46022 KANE SHERYL UNKNOWN AR
46026 FERGUS SARAH MUNCIE IN
46027 BUCK SARAH MUNCIE IN
#注意格式,现在指定匹配的字段为第5个字段
$ awk '$5~/AR/' emp_names
46022 KANE SHERYL UNKNOWN AR
#与上面的命令相反
awk '$5!~/AR/' emp_names
46012 DULANEY EVAN MOBILE AL
46013 DURHAM JEFF MOBILE AL
....
修饰一下输出内容:
#字段间用tab隔开
awk '{print $1"\t"$2"\t"$3"\t"$4"\t"$5}' emp_names
46012 DULANEY EVAN MOBILE AL
46013 DURHAM JEFF MOBILE AL
......
示例:
花括号:命令组,花括号内为一个命令组, 一条awk命令可以有多个命令组组成,如:
$ awk '{print $1, $2} {print $4, $5}' emp_names
46012 DULANEY
MOBILE AL
46013 DURHAM
MOBILE AL
46015 STEEN
MOBILE AL
。。。。
字段分隔符:
输入字段分隔符:-F设置, 如/etc/passwd文件字段用':'分隔。我们可以使用-F":"指定, 指定多个-F"[:# ]"
awk -F":" '{print $1, $2}' /etc/passwd
输出字段分隔符:OFS设置
awk '{OFS="-"}{print $1, $2, $3, $4, $5}' emp_names
46012-DULANEY-EVAN-MOBILE-AL
46013-DURHAM-JEFF-MOBILE-AL
46015-STEEN-BILL-MOBILE-AL
往输出添加内容:
$ awk '$5~/IN/ {print "NAME: "$2", "$3"\nCITY_STATE:"$4", "$5"\n"}' emp_names
NAME: WOOD, WILLIAM
CITY_STATE:MUNCIE, IN
输出到文件
示例:
$ awk '{print NR, $1>"/tmp/filez"}' emp_names
$ cat /tmp/filez
1 46012
2 46013
3 46015
4 46017
管道
注意:命令必须用双引号括起来
示例:
注意:错误的示例:
$ awk '{print $2 | sort}' emp_names
awk: (FILENAME=emp_names FNR=1) fatal: expression for `|' redirection has null string value
正确的示例:
$ awk '{print $2 | "sort"}' emp_names
BOGUE
BUCK
DULANEY
DURHAM
FELDMAN
FERGUS
JUNE
调用命令文件
$ cat >awklist
{print $3, $2}
{print $4, $5, "\n"}
^C
$ awk -f awklist emp_names
EVAN DULANEY
MOBILE AL
.......
阅读(2052) | 评论(0) | 转发(0) |