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

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

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

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

(以下命令可以在终端直接运行,也可以写成Shell文件,当然得先知道什么是sed)
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的正则表达式
简单介绍一下 正则表达式

.  表示除.之外任意单个字符
*  重复0-n次
+  重复1-n次
? 重复0-1次 
{m} 重复m次
{m,n} 重复m-n次
{m,} 至少重复m次

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

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

g代表global 全局匹配,
否则一旦匹配到,就换下一行处理了

命令总结:

  先写出来 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选项
这道题就是让你知道一下,带-n和不带-n的区别:带-n 静默打印,只打印一行;不带-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

命令总结:sed ‘y/…/…/’ 可以进行字典替换

man sed 中的解释:
y/source/dest/
       Transliterate the characters in the pattern space  which  appear
       in source to the corresponding(相应的) character in dest.

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

姓名 籍贯 语文 C语言 数据库 离散数学 Java
1  2  3  4  5   6    7

张敏 南京 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,6nr student
对-k -n -r的解释
-k, --key=POS1[,POS2]
       start a key at POS1 (origin 1), end it at POS2 (default end of line)
-n, --numeric-sort
              compare according to string numerical value
-r, --reverse
       reverse the result of comparisons

运行结果(根据评论,已更正):
运行结果

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

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

cut -d " " 按空格进行切割
    -f 2   使用第2域的数据,域即列
uniq -c    统计重复的行

运行结果,sort可以没有
统计结果

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

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

head -m 取前m个记录

运行结果
head结果

命令总结

这些命令如果不会的话,可以随时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)列出总分最高的人的记录。(根据评论,已更正)

awk求总分最高分
运行结果:
更正

(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}
上面的结果空格也计算在内
下面使用sed去掉空格
x="erte dgg rgtd rg"

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

wc -c 统计字节
wc -m 统计字符
因为英文一个字符就是一个字节,所以 -c和-m可以混用

追加三道大题

一、Shell编程:双重循环显示图形

打印正三角
运行结果:
运行结果

变形,打印倒三角

倒三角代码
运行结果:
倒三角结果

二、回文数函数

回文数函数
运行结果:
回文数运行结果

三、求素数

素数函数
运行结果:
素数运行结果

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

  • 19
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 21
    评论
评论 21
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值