Linux中awk和sed命令

Linux中的awk和sed命令的主要应用场景是shell script,在shell script中用于处理字符串,然后得到自己想要的结果

sed的常用参数
–-n 静默模式,不再默认显示模式空间中的内容
–-i 直接修改原文件
–-e -e SCRIPT:可以同时执行多个脚本
–-f /PATH/TO/SED_SCRIPT
–-r 表示使用扩展正则表达式

sed的常用命令
–Command:
–d 删除符合条件的行;
–p 显示符合条件的行;
–a \string: 在指定的行后面追加新行,内容为string
–\n 可以用于换行
–i \string: 在指定的行前面添加新行,内容为string
–r FILE 将指定的文件的内容添加至符合条件的行处
–w FILE 将地址指定的范围内的行另存至指定的文件中;
–s/pattern/string/修饰符: 查找并替换,默认只替换每行中第一次被模式匹配到的字符串,加修饰符g: 全局替换,i: 忽略字符大小写

例题 1:
文件名:datafile
文件内容:
northwest NW Charles Main 3.0 .98 3 34
western WE Sharon Gray 5.3 .97 5 23
southwest SW Lewis Dalsass 2.7 .8 2 18
southern SO Suan Chin 5.1 .95 4 15
southeast SE Patricia Hemenway 4.0 .7 4 17
eastern EA TB Savage 4.4 .84 5 20
northeast NE AM Main Jr. 5.1 .94 3 13
north NO Margot Weber 4.5 .89 5 9
central CT Ann Stephens 5.7 .94 5 13

1、找到以north开头的行并在其后添加LUCK a是在符合条件的后面添加新行
sed ‘/^north/a\LUCK’ datafile
2、在以central开头的行前分行插入LUCK
sed ‘/central/i\L\nU\nC\nK’ datafile i是在符合条件的前面添加新行
3、把有sourth的行全部用LUCK取代
sed ‘/south/c LUCK’ datafile c是替换符合条件的行
4、删除第一行
sed ‘1 d’ datafile d 删除符合条件的行
5、删除1-4行
sed ‘1,4 d’ datafile
6、删除所有带有north的行
sed ‘/north/d’ datafile
7、用LUCK替换north s是查找并替换符合的内容 \转义字符
sed ‘s/north/LUCK/g’ datafile sed ‘/^south/s/south/FUCK/g’ datafile
8、寻找大于1少于10的一位小数并用LUCK+&替代。这里的&保存了前面的小数
sed ‘s/[0-9].[0-9]/LUCK&/’ datafile
9、默认打印所有的行。这里用-n选项过滤无关的行 p打印符合条件的行
sed -n ‘/north/p’ datafile //如果不使用-n的话,会打印两次
10、多行答应
sed ‘/north/P’ datafile P多行打印
11、多行删除
sed -e ‘/^ /Ne/\n /d’ datafile sed -e ‘/^ /Ne/\n /D’ datafile
使用d,若有偶数个空行将会全被删除,若有奇数个空行将会保留一行。
这是因为d删除的是整个模式空间的内容。一旦遇到第一个空行就马上读入下一行,
然后两行都删除。如果第三行为空且下一行不为空则命令不执行,空行被输出。
使用D,当遇到两个空行时D会删除两个空行中的第一个,然后再读入下一行,
如果是空行则删除第一行,如果空行后有文本则模式空间可以正常输出。
12、从datafile中读取相关的内容添加到sed.txt中所有匹配的行的后面
sed ‘/^south/r datafile’ sed.txt //r从文件中读取,两个文件中必须要有相同部分
13、把datafile中所有匹配的行写入到sed.txt文件中
sed ‘/^south/w sed.txt’ datafile | cat test //w写入文件
14、如果有能匹配western行,则n命令使得sed读取下一行,然后执行相应命令
sed -e ‘/western/n’ -e ‘s/SW/FUCK/’ datafile|head -n 4 //n (next) +文件名
15、将s替换成S
sed ‘1,$y/s/S/’ datafile //y替换 注意:最后一个/一定不要忘记填写
替换的类型要一致,数字与字母之间不能相互替换。
且对正则表达式的元字符不起作用。
16、打印三行后退出
sed ‘3q’ datafile
17、用相应的字符做出替换后退出
sed -e ‘y/sourth/luckly/’ -e q datafile

例题 2:
1、将文本中的test替换成mytest
sed -n ‘s/^test/mytest/p’ sed.txt
2、只打印从第五行开始到第一个包含以wang开始的行之间的所有行
sed -n ‘5,/^wang/p’ sed.txt
3、 将小数点及之后的内容清除
echo 112.110 | sed -e ‘s/..//g’ // -e执行脚本 代表多个字符 .代表匹配.
4、在sed.txt中所有包含test的行都被写入file里
cat file | sed ‘/test/w file’ sed.txt
5、在3到5行之间添加内容为4
sed -e ‘3,5 a4’ sed.txt a表示添加行 4代表内容
6、打印love和unlove之间所有行
sed -n ‘/love/,/unlove/p’ sed.txt
7、删除3行到最后一行所有的内容
sed ‘3,$ d’ sed.txt
8、仅列出sed.txt的5-7行
sed -n ‘3,7 p’ sed.txt
9、从第2行开始,连续4行(2-6行)
sed -n ‘2,+4 p’ sed.txt
10、在test1行后追加一个admin行
sed ‘/test1/a admin’ sed.txt

awk的基本格式:
awk ‘{pattern + action}’ {commands}
其中pattern 表示AWK 在数据中查找的内容,而action 是在找到匹配内容时所执行的一系列命令。
–花括号({})不需要在程序中始终出现,但它们用于根据特定的模式对一系列指令进行分组。
–pattern就是要表示的正则表达式,用斜杠括起来。

awk的常用参数:
-F 以什么作为分割符

注意下列例题中在$前面的”\”是转义字符的意思,因为CSDB博客中不能直接输入$,所以需要前面加入一个,有的地方能够识别,索性在下列的例题中$前面都加上, 在Linux中实际操作的时候删掉即可

例题 1:
文件名称:logs.txt
文件内容:
2 this is a test
3 Are you like awk
This’s a test
10 There are orange,apple,mongo

1、输出文本的1、4项
awk ‘{print $1,$4}’ logs.txt
2、格式化输出
awk ‘{printf “%-8s %-10s\n”,$1,$4}’ logs.txt //必须是printf,以某一种格式输出, %-8s控制输出位置 \n 控制换行
3、使用”,”分割第一项和第二项
awk -F “,” ‘{print $1,$2}’ logs.txt // —F以什么切割,后面的符号可以是空,单引号,双引号
4、多重分割,使用[]分割,先对空格进行分割,后用,进行分割
awk -F ‘[ ,]’ ‘{print $1,$2,$5}’ logs.txt
5、过滤第一列大于2的行
awk ‘ 1>2logs.txt62awk 1==2’ logs.txt awk ‘$1==2 {print $1,$5}’ logs.txt
7、输出第一列大于2,并且第二列等于“Are” 同时输出第一,第三,第五列的内容
awk ‘$1>2&&$2==”Are”’ logs.txt awk ‘$1>2&&$2==”Are” {print $1,$3,$5}’ logs.txt //注意字符型匹配使用双引号

例题 2:
文件名称:grade.txt
文件内容:
M.Tansley 05/99 48311 Green 8 40 44
J.Lulu 06/99 48317 green 9 24 26
P.Bunny 02/99 48 Yellow 12 35 28
J.Troll 07/99 4842 Brown-3 12 26 26
L.Tansley 05/99 4712 Brown-2 1230 28 27

1、打印整个文件
awk ‘{print $0}’ grade.txt
2、打印第一和第四个域
awk ‘{print $1,$4}’ grade.txt
3、打印表头
awk ‘BEGIN{print “name color\n——————-\n”} {print $1”\t”$4}’ grade.txt //BEGIN只在开头打印,如果没有BEGIN,每一行都打印
4、打印$4 包含 Brown 的行
awk ‘\$4~/Brown/{print \$0}’ grade.txt ~匹配正则表达式(含有),/Brown/
5、非精确匹配48
awk ‘\$3~/48/ {print \$0}’ grade.txt
6、精确匹配48
awk ‘\$3==48 {print \$0}’ grade.txt
7、不精确匹配Brown的
awk ‘\$0!~/Brown/ {print \$0}’ grade.txt
8、精确不匹配
awk ‘\$0!=/Brown/ {print \$0}’ grade.txt
9、小于
awk ‘\$6 < \$7 {print \$0 “\$1 Try better at the next comp”}’ grade.txt awk ‘\$6 < \$7 {print \$0 \$1 ” Try better at the next comp”}’ grade.txt
10、设置大小写
awk ‘/[Gg]reen/’ grade.txt
11、匹配第三个字符是a的内容
awk ‘\$1~/^…a/’ grade.txt //~匹配 ^以什么开始 … 一个符号代表一个字母位置
12、检索带有Yellow或者Brown的内容
awk ‘\$0~/(Yellow|Brown)/’ grade.txt // 或(|)必须使用()括起来

例题 3:
1、统计变量个数
echo “stand” | awk ‘{print length}’ 可以不加$0
2、统计文本的行数
awk ‘{n++} END{print n “line”}’ grade.txt //END最后输出,否则每一行输出一次
3、显示最后一分段的值
awk ‘{print \$NF}’ grade.txt
4、利用begin赋值
awk ‘BEGIN{var = “1”} {if(\$1>var) print \$0}’ grade.txt
5、算数运算
awk ‘BEGIN {print(1+2)}’ //必须加BEGIN
6、显示记录数
awk ‘END {print NR}‘ grade.txt

你可能感兴趣的:(Big,Data,shell,linux,awk,脚本,sed)