【Linux】sed、awk、cut、sort常用命令

1、利用sed命令在/etc/passwd中分别查找满足以下条件的行:

  首先在操作之前,先整一份数据,为了可视化方便,整到桌面。(之所以费劲整到桌面上就是为了照顾一些初学者,当执行完下面两句命令后,会发现桌面上多了一个文件,相当于是看到正反馈了,就会给人信心,告诉自己付出就有回报。)

cd ~/Desktop
cat /etc/passwd >> passwd

(以下命令可以在终端直接运行,也可以写成Shell文件,当然得先知道什么是sed)
sed说明

(1) o字符重复任意次

sed -n '/o*/p' passwd

或者

#! /bin/bash
sed -n '/o\{0,\}/p' passwd
echo "运行结束"

(2) o字符重复一次以上

 sed -n '/o\{1,\}/p' passwd

(3) o字符重复两次以上

sed -n '/o\{2,\}/p' passwd
或者
sed '/o.*o/p' /etc/passwd   #可连续可不连续

命令总结:

  sed中使用正则表达式,先写出来 sed -n ‘//p’ 文件名
然后再在//中填写正则表达式,注意圆括号()和花括号{}都需要转义符,即\(\)\{\},如下所示

sed -n '/正则表达式/p' 文件名

sed的正则表达式

2、利用sed命令将input文件中的\OU字符串修改为(ou)

sed 's/\\OU/(ou)/gp' input

命令总结:

  先写出来 sed -n ‘s///gp’ 文件名 g :global 表示全局匹配
然后再在///(三斜杠)之间填写字符串,如下所示

sed -n 's/原字符串/替换后字符串/p' input

sed的替换命令

3、利用sed命令打印input文件中除第3-8行之外的所有行,在以下三种不同选项组合下运行该命令:

(1)不带任何选项:

sed '3,8d' passwd

(2)只带一p选项;

sed '3,8!p' passwd

(3)同时带一n和一p选项

sed -n '3,8!p' input

命令总结

  (1)不带任何选项是不可能的,题目的意思是不打印3-8行内容,所以直接的想法就是将3-8行内容删除,即delete,对应的就是d选项
  (2)如果不带-n选项的话,p选项会将处理过的行打印两编,没处理过的行打印一遍。
  (3)带上-n会呈现静默打印,意思就是打印出来你想要的效果。
sed的-n选项

4、用两个不同的命令实现如下功能:将input文件中的\OU字符串修改为(ou),并在与\OU的匹配行后追加“We find \OU!”字符串。

sed -n -e 's/\\OU/(ou)/g ; s/(ou).*$/&We find \\OU/gp' input
	或者
sed -n -e 's/\\OU/(ou)/g' -e 's/(ou).*$/&We find \\OU/gp' input

命令总结:

  首先,需要组合命令,有两种方式,一种是用分号隔开,一种是多个 -e 即如下所示

	  sed -e '命令1;命令2' 文件名
	  sed -e '命令1' -e '命令2' 文件名

sed的-e选项
  然后是在行末追加,其实本质还是替换语句,只不过在’s//&这里/’,的开头加上&后就变成在所要替换的内容之后追加,至于行末,就是在’s/这里 / / //' 的后面加上 表示行末,这样就符合在所要替换内容的行末之后追加命令如下:

	  sed -n 's/(ou).*$/&We find \\OU/gp' input

  如果是行首的话,应该是’s/^这里/替换后的字符串&/’ 的前面加上^,并且看到替换后的字符串也就到了&符号之前了,命令如下:

	  sed -n -e 's/\\OU/(ou)/g' -e 's/^.*(ou).*/WE find&/gp' input

  可以仔细体会一下。

5、将input文件中的abcde字符分别用EDCBA替换。

sed 'y/abcde/EDCBA/' input

命令总结:

  字典替换,不再需要-n p ,s替换成y

sed的字典匹配

7、在student文件中有7个域,表示学生姓名、籍贯、C语言,数据库,离散数学,java考试成绩,student内容如下:

张敏 南京 76 89 66 93 67
李准 石家庄 86 92 76 83 87
小飞 邢台 88 66 55 96 93
王波 岳阳 93 79 85 78 90
柏慧 无锡 94 76 82 86 91
图雅 绍兴 96 77 86 84 90
安冬 绍兴 96 87 96 94 97

(1)按Java考试成绩排序,从低到高,如果Java成绩相同,再按离散数学排序从高到低。

sort -k 7,7n -k 6,6n student

(2)按籍贯统计学生人数

cut -d " " -f 2 student | sort |uniq -c

(3)找出Java成绩最高的前五名学生的情况

sort -k 7,7nr student | head -5

命令总结

这些命令如果不会的话,可以随时man sort,或者man cut,或者 man 你想查的命令,我这里简单写几个:

sort 小结

分隔符 -t
-t, --field-separator=SEP use SEP instead of non-blank to blank transition
按字典排序(默认升序)
-d, --dictionary-order consider only blanks and alphanumeric characters
字典,Linux默认编码是UTF-8,即Linux的字典
图 < 安 < 小 < 李 < 柏 < 王
\u56fe\u5b89\u5c0f\u674e\u67cf\u738b
翻转 -r
sort默认是升序排序的,加上r选项就可以变成降序排序

cut 小结

定界符 -d (类似sort里面的分隔符 -t)
-d, --delimiter=DELIM use DELIM instead of TAB for field delimiter

8 利用awk完成,针对Student文件

下面这些 内容就是awk了,awk官方说是一门编程语言,几句话讲不清,具体可以在命令行输入man awk查看官方文档。

(1)列出姓名,总分, 平均分

awk '{ print $1,$3+$4+$5+$6+$7,($3+$4+$5+$6+$7)/5; }' student

(2)列出总分最高的人的记录。

(3)学生总分小于450的学生姓名

awk '{ if(($3+$4+$5+$6+$7)<450)  print $1; }' student

9. 写一个命令,去掉某文件中所有的空格符,并将结果存储到a.txt。

sed 's/ //g' student > a.txt

10.写一个命令,输出某Shell变量中所包含字符的个数。

在此基础上,再写一个命令,输出该变量中所包含字母的个数(空格不计算在内 )。(提示:用sed和wc命令)

s="123abcde456 fghi"

echo ${#s}

x="erte dgg rgtd rg"

echo $x |sed 's/ //g' |wc -c

撒花出门记得点赞哟!撒花

猜你喜欢

转载自blog.csdn.net/midnight_time/article/details/84872615