练习一
gol.ssecca
gol.rorre.tobia
gol.tobia
gol.rorre.oi.ni.irabma
gol.oi.ni.irabma
gol.rorre.ofni.yjcy.dcic
gol.ofni.yjcy.dcic
gol.rorre.ofni.yjcy.smc
gol.ofni.yjcy.smc
gol.rorre.cc.yjcy.maxe
gol.cc.yjcy.maxe
gol.rorre.ofni.yjcy.selif
gol.ofni.yjcy.selif
gol.rorre.ofni.yjcy.sml
gol.ofni.yjcy.sml
gol.rorre.ofni.yjcy.udeem
gol.ofni.yjcy.udeem
gol.rorre.ofni.yjcy.codnim
gol.ofni.yjcy.codnim
gol.rorre.ofni.yjcy.mdasuxen
gol.ofni.yjcy.mdasuxen
gol.rorre.ofni.yjcy.suxen
gol.ofni.yjcy.suxen
gol.rorre_xnign
gol.rorre.oi.ni.nap
gol.oi.ni.nap
gol.rorre.ofni.yjcy.smp
gol.ofni.yjcy.smp
nohtyp
gol.rorre.ofni.yjcy.emuser
gol.ofni.yjcy.emuser
gol.rorre.oi.ni.codwohs
gol.oi.ni.codwohs
gol.rorre.ofni.yjcy.nvs
gol.ofni.yjcy.nvs
gol.rorre.oi.ni.www
gol.oi.ni.www
gol.rorre.ofni.yjcy.www
gol.ofni.yjcy.www
gol.rorre.oi.ni.muy
gol.oi.ni.muy
1) 求出第二个单词出现的频率
1 cc
1 nohtyp
12 ofni
5 oi
19 rorre
1 rorre_xnign
1 ssecca
1 tobia
2) 统计出不同文件后缀名称的文件个数。
结果如下
3 emuser
2 muy
练习二
1) 找出股票收盘价最高并且日期最小的数据,结果要求如下
股票名称 日期 最高价cat 000005.csv | sort -t, -k4n -k1r |tail -1
cat 000006.csv | sed 1d | awk -F, 'BEGIN{max=0;date='9999-99-99'} { if (max<$4) { max=$4 ; if(date>$1){date=$1} } } END{ print date , max} '
2)统计出股票的在2018年的平均收盘价格cat 000005.csv | grep ^2018 | awk -F, '{ sum+=$4}END{print sum/FNR}'
3)找出股票停牌的总天数(停牌日期中,这一行包含了字符None)grep -ic none 000005.csv
4)将股票代码前面的单引号替换成花括号。如下
‘000004 ,变成{000004}
,000004,=>,{ 000004 },
cat 000005.csv | sed -E -e "s/'//g" -e 's/,([0-9]{6}),/,\{\1\},/g'
cat 000006.csv | sed -E -e "s/'//g" -e 's/(,)(0[0-9]{5})(,)/\1\{\2\}\3/'
5) 导入数据的时候,需要将csv文件的头一行字段名称,拼接成创建表的语句
create table stock (股票名称
varchar(255), 股票代码
varchar(255) ..) charset=utf8;
head -1 000005.csv | sed 's/,/` varchar(255) , `/g' | sed '1i create table t00005 ( ' | sed '2s/^/`/g' | sed '2s/$/` varchar(255) ) charset=utf8;/g'
6) 一般日志备份都是类似形式 xxxx.log.yyyymmdd的日期,目录在/var/log 下,比如mail.log.20231101
先要把类似这些文件都找到并且移动到/backup/logs目录下,写出语句。find /var/log |grep -E '[0-9]{8}$' | xargs mv -i '{}' /backup/logs
运维必备技能∶基本正则表达式及扩展正则表达式
练习三 - 求出当前机器IP地址
- 主要是查找文本内容
查出本机器的IP地址
ip a |grep -Eo '([0-9]{1,3}\.){3}[0-9]{1,3}' |grep -v ^127
- 找出/etc目录下所有的以conf结尾的问题。
- 找出/etc目录所有文件,文件内容中包含centos,并且以conf结尾的文件列表。
练习四
删除注释和空号,一般来讲,配置文件可能会10000行,但是有用的只有2行。
[root@localhost ~]# sed -e '/^$/d' -e '/^#/d' /etc/selinux/config
SELINUX=enforcing
SELINUXTYPE=targeted
[root@localhost ~]# w |sed 1,2d |wc -l
-i: 在指定的行上方增加一行文字
-a: 在指定的行下方增加一行文字
小结练习
当然,请见以下是按照新要求重新回答的10个问题,包含了具体的文件和文件格式要求。这些题目将涉及到管道、复杂的文本处理流程和正则表达式的使用。
- 统计访问次数
场景: 统计一个日志文件中特定IP地址的访问次数。
文件: access.log
文件格式: 每行记录包含日期、时间和IP地址,以空格分隔。
示例文件内容:
2021-01-01 10:00:00 192.168.0.1
2021-01-01 10:01:00 192.168.0.2
2021-01-01 10:02:00 192.168.0.1
2021-01-01 10:03:00 192.168.0.1
2021-01-01 10:04:00 192.168.0.3
cat access.log | egrep ‘([0-9]{1,3}.){3}[0-9]{1,3}’ | sort | uniq -c
使用uniq之前,必须先使用sort排序。
- 脱敏处理手机号码
场景: 将一个文件中所有的手机号码替换为脱敏处理的格式(例如:【138****1234)。
文件: data.txt
文件格式: 每行记录包含姓名和手机号码,以逗号分隔。
把电话改成***
cat data.txt | sed -E ‘s/[0-9]{11}/*{11}/g’
示例文件内容:
张三,13812345678
李四,13987654321
王五,13713572468
赵六,13698765432
cat data.txt | sed ‘s/(1[0-9]{2})[0-9]{4}([0-9]{4})/\1****\2/g’
- 提取并排序电子邮件地址
场景: 从一个文件中提取出所有的电子邮件地址,并按字母顺序排序。
文件: contacts.txt
文件格式: 每行记录包含姓名和电子邮件地址,以制表符分隔。
示例文件内容:
张三 zhangsan@example.com
李四 lisi@example.com
王五 wangwu@example.com
赵六 zhaoliu@example.com
cat email.txt |egrep -o ‘\s[^@]+@[^@]+.[^@]{2,4}’ | sed -E ‘s/\s+//g’
- 提取并排序URL链接
场景: 将一个文件中的所有URL链接提取出来,并按照访问次数进行排序。
文件: websites.txt
文件格式: 每行记录包含URL链接和访问次数,以空格分隔。
示例文件内容:
http://example1.com 100
https://example2.com 50
https://example3.com 200
http://example4.com 75
- 提取错误日志
场景: 从一个日志文件中提取出所有发生错误的行,并将它们写入一个新的文件。
文件: error.log
文件格式: 每行记录包含日期、时间和错误消息,以制表符分隔。
示例文件内容:
2021-01-01 10:00:00 Error message 1
2021-01-01 10:01:00 Info message 1
2021-01-01 10:02:00 Error message 2
2021-01-01 10:03:00 Error message 3
2021-01-01 10:04:00 Info message 2
- 转换英文单词格式
场景: 将一个文件中所有的英文单词转换为首字母大写的格式。
文件: text.txt
文件格式: 每行记录包含一段文字。
示例文件内容:
this is a sample text
to demonstrate the exercise
of converting words to title case
- 统计单词出现次数
场景: 统计一个文件中每个单词出现的次数,并按照出现次数进行排序。
文件: words.txt
文件格式: 每行记录包含一个单词。
示例文件内容:
apple
banana
orange
apple
banana
banana
orange
- 提取并排序日期
场景: 从一个文件中提取出所有的日期,并按照日期顺序进行排序。
文件: dates.txt
文件格式: 每行记录包含日期和事件描述,以制表符分隔。
示例文件内容:
2021-01-01 Event 1
2021-02-01 Event 2
2021-03-01 Event 3
2021-01-15 Event 4
- 删除HTML标签
场景: 将一个文件中的所有HTML标签删除,并将纯文本保存到一个新的文件中。
文件: page.html
文件格式: 包含HTML标记的网页文件。
示例文件内容:
<html>
<body>
<h1>Title</h1>
<p>This is a paragraph.</p>
</body>
</html>
- 提取并排序IPv6地址
场景: 从一个文件中提取出所有的IPv6地址,并按照地址长度进行排序。
文件: network.txt
文件格式: 每行记录包含网络设备名称和IPv6地址,以制表符分隔。
示例文件内容:
Device1 2001:0db8:85a3:0000:0000:8a2e:0370:7334
Device2 2001:0db8:85a3:0000:0000:8a2e:0370:7335
Device3 2001:0db8:85a3:0000:0000:8a2e:0370:7336
Device4 2001:0db8:85a3:0000:0000:8a2e:0370:7337
希望这些题目能够帮助新员工更好地熟悉sed和grep的使用,并加深他们对文本处理和正则表达式的理解。
答案
以下是题目的答案:
- 统计访问次数
cat access.log | grep "192.168.0.1" | wc -l
- 脱敏处理手机号码
sed -E 's/([0-9]{3})[0-9]{4}([0-9]{4})/\1****\2/g' data.txt
- 提取并排序电子邮件地址
grep -oE '[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}' contacts.txt | sort
- 提取并排序URL链接
grep -oE 'http[s]?://[^ ]+' websites.txt | sort -k2,2nr
- 提取错误日志
grep "Error" error.log > error.txt
- 转换英文单词格式
cat text.txt | sed -E 's/\<./\U&/g'
- 统计单词出现次数
cat words.txt | sort | uniq -c | sort -k1,1nr
- 提取并排序日期
cut -f1 dates.txt | sort
- 删除HTML标签
sed -E 's/<[^>]*>//g' page.html > text.txt
- 提取并排序IPv6地址
cut -f2 network.txt | sort -t: -k8,8n -k7,7n -k6,6n -k5,5n -k4,4n -k3,3n -k2,2n -k1,1n
希望以上答案对您有所帮助!
awk
awk具体用法
awk -F: ‘BEGIN{}{}END{}’ filelist
-F: 表示以:作为分隔符,默认的不可见字符做分隔符\t ,和空格
- BEGIN可以省略,如果有,表示在处理匹配的行之前,执行里面的语句,一般是初始化动作。
- END可以忽略,如果有,把最后一行执行完毕之后,执行END里面的语句,只执行一次。
例子:获取当前的用户个数[root@localhost ~]# w | head -1 | awk -F, '{print $3}' | cut -d ' ' -f3
例子:求和
ll | sed 1d | awk ‘BEGIN{sum=0}{sum+=$5 }END{print sum}’
小结综合题
当然,我可以为您提供一些更具挑战性的题目,涉及到文本处理命令、管道、重定向、基础命令和正则表达式。以下是20道综合性题目:
创建一个名为
data.txt
的文本文件,并写入以下内容:Name: John Age: 25 Email: john@example.com
从
data.txt
文件中提取出姓名,并将结果保存到name.txt
文件中。从
data.txt
文件中提取出邮箱,并将结果保存到email.txt
文件中。在
data.txt
文件中,将所有的冒号(:)替换为空格,并将结果保存到data_modified.txt
文件中。创建一个名为
numbers.txt
的文本文件,并写入以下内容:1 22 333 4444 55555
统计
numbers.txt
文件中每行数字的位数,并将结果保存到digit_count.txt
文件中。在
numbers.txt
文件中,将所有的数字都乘以2,并将结果保存到doubled_numbers.txt
文件中。创建一个名为
words.txt
的文本文件,并写入以下内容:apple banana carrot dog elephant
将
words.txt
文件中的每个单词转换为首字母大写,并将结果保存到capitalized_words.txt
文件中。创建一个名为
log.txt
的文本文件,并写入以下内容:[2021-01-01 10:00:00] INFO: Application started. [2021-01-01 10:01:00] ERROR: Invalid input. [2021-01-01 10:02:00] INFO: Request received.
从
log.txt
文件中提取出所有的错误信息,并将结果保存到errors.txt
文件中。统计
log.txt
文件中每个时间段内的日志数量,并将结果保存到log_count.txt
文件中。创建一个名为
students.csv
的CSV文件,并写入以下内容:Name,Age,Grade John,25,A Alice,22,B Michael,24,A
从
students.csv
文件中提取出所有年龄大于等于23岁的学生信息,并将结果保存到older_students.csv
文件中。在
students.csv
文件中,将所有的年级都替换为大写字母,并将结果保存到uppercase_grades.csv
文件中。创建一个名为
contacts.txt
的文本文件,并写入以下内容:`
Name: John
Phone: 123456789
Email: john@example.com
Name: Alice
Phone: 987654321
Email: alice@example.com
17. 从`contacts.txt`文件中提取出所有的姓名、电话和邮箱,并将结果保存到`contact_details.txt`文件中。
18. 将`contacts.txt`文件中的所有空行删除,并将结果保存到`cleaned_contacts.txt`文件中。
19. 创建一个名为`words.txt`的文本文件,并写入以下内容:
apple
banana
carrot
dog
elephant
20. 从`words.txt`文件中提取出所有以字母"a"开头和以字母"t"结尾的单词,并将结果保存到`filtered_words.txt`文件中。
#最新题目
明白了,下面是更新后的题目,每个题目附有更详细的示例文件和文本格式内容。请注意这些文件内容是虚拟的,仅供参考。
### 题目1: 查找并计数
**题目:** 使用 `grep` 和 `wc` 命令来查找 `/var/log/syslog` 文件中所有出现的 "error" 字符串,并统计出现的次数。
**示例文件:** `/var/log/syslog`
**示例文本格式:**
Aug 15 10:00:01 hostname some message
Aug 15 10:01:01 hostname error: something went wrong
Aug 15 10:02:01 hostname another message
Aug 15 10:03:01 hostname error: another issue
Aug 15 10:04:01 hostname more messages
Aug 15 10:05:01 hostname error: yet another error
Aug 15 10:06:01 hostname some more messages
Aug 15 10:07:01 hostname no error here
Aug 15 10:08:01 hostname another error
Aug 15 10:09:01 hostname final message
### 题目2: 替换文件中的文本
**题目:** 使用 `sed` 命令将 `/etc/hosts` 文件中所有的 "localhost" 替换为 "localserver"。
**示例文件:** `/etc/hosts`
**示例文本格式:**
127.0.0.1 localhost
::1 localhost
192.168.1.1 router
127.0.1.1 hostname
10.0.0.1 localserver
127.0.0.2 localhost
192.168.1.2 localserver
::1 localhost
192.168.1.3 localserver
127.0.0.3 localhost
### 题目3: 查找并排序文件内容
**题目:** 使用 `find` 命令查找 `/home/user` 目录下所有的 `.txt` 文件,并使用 `grep` 查找这些文件中包含 "important" 的行,然后使用 `sort` 对这些行进行排序。
**示例文件:** `/home/user/file1.txt`, `/home/user/file2.txt`
**示例文件1内容:** `/home/user/file1.txt`
This is an important line.
This is another line.
Important data needs to be reviewed.
Another line without the keyword.
This is an important document.
**示例文件2内容:** `/home/user/file2.txt`
Nothing important here.
Review the important details.
Important notes are here.
Nothing special.
Important information.
### 题目4: 统计文件行数
**题目:** 使用 `wc` 命令统计 `/etc/passwd` 文件的总行数。
**示例文件:** `/etc/passwd`
**示例文本格式:**
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
### 题目5: 查找进程并重定向输出
**题目:** 使用 `ps` 命令查找所有包含 "nginx" 的进程,并将结果重定向到 `/tmp/nginx_processes.txt` 文件中。
**示例文件:** `/tmp/nginx_processes.txt`
**示例文本格式:**
PID TTY TIME CMD
123 ? 00:00:10 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
124 ? 00:00:05 nginx: worker process
125 ? 00:00:03 nginx: worker process
126 ? 00:00:02 nginx: worker process
127 ? 00:00:01 nginx: worker process
### 题目6: 查找并删除指定文件
**题目:** 使用 `find` 命令查找 `/home/user` 目录下所有超过 30 天的 `.log` 文件,并使用 `rm` 命令删除这些文件。
**示例文件:** `/home/user/old_log1.log`, `/home/user/old_log2.log`, `/home/user/new_log.log`
**示例文件内容:**
`/home/user/old_log1.log` 和 `/home/user/old_log2.log` 的创建时间早于 30 天
`/home/user/new_log.log` 的创建时间在 30 天之内
### 题目7: 移动文件并修改文件名
**题目:** 使用 `mv` 命令将 `/tmp/oldfile.txt` 文件移动到 `/home/user/` 目录,并将其重命名为 `newfile.txt`。
**示例文件:** `/tmp/oldfile.txt`
**示例文本格式:**
This is a sample text file.
It contains some example text.
It will be moved and renamed.
### 题目8: 查找并计算文件中唯一单词数
**题目:** 使用 `tr` 和 `sort` 命令,将 `/home/user/document.txt` 文件中的所有单词转换成小写,并统计唯一单词的数量。
**示例文件:** `/home/user/document.txt`
**示例文本格式:**
Hello World
Hello world again
This is a test document
With some sample text for testing
Hello again
world test
### 题目9: 显示文件中的特定行
**题目:** 使用 `sed` 命令从 `/etc/hostname` 文件中显示第 2 行到第 4 行的内容。
**示例文件:** `/etc/hostname`
**示例文本格式:**
hostname1
hostname2
hostname3
hostname4
hostname5
hostname6
hostname7
hostname8
hostname9
hostname10
### 题目10: 查找进程并排序
**题目:** 使用 `ps` 命令列出所有进程,并使用 `sort` 对输出按照进程 ID (PID) 进行升序排序。
**示例文件:**
(此命令输出的内容作为文件或终端显示)
PID TTY TIME CMD
101 ? 00:00:05 process1
102 ? 00:00:03 process2
103 ? 00:00:02 process3
104 ? 00:00:01 process4
105 ? 00:00:00 process5
##答案
好的,以下是针对每道题目的解决方案:
### 题目1: 查找并计数
**题目:** 使用 `grep` 和 `wc` 命令来查找 `/var/log/syslog` 文件中所有出现的 "error" 字符串,并统计出现的次数。
**答案:**
```sh
grep -o 'error' /var/log/syslog | wc -l
这条命令会输出 “error” 出现的次数。
题目2: 替换文件中的文本
题目: 使用 sed
命令将 /etc/hosts
文件中所有的 “localhost” 替换为 “localserver”。
答案:
sed -i 's/localhost/localserver/g' /etc/hosts
-i
参数表示直接在文件中进行替换。
题目3: 查找并排序文件内容
题目: 使用 find
命令查找 /home/user
目录下所有的 .txt
文件,并使用 grep
查找这些文件中包含 “important” 的行,然后使用 sort
对这些行进行排序。
答案:
find /home/user -name '*.txt' -exec grep 'important' {} + | sort
-exec
选项用来对找到的每个文件执行 grep
命令。
题目4: 统计文件行数
题目: 使用 wc
命令统计 /etc/passwd
文件的总行数。
答案:
wc -l /etc/passwd
-l
参数用于显示行数。
题目5: 查找进程并重定向输出
题目: 使用 ps
命令查找所有包含 “nginx” 的进程,并将结果重定向到 /tmp/nginx_processes.txt
文件中。
答案:
ps aux | grep '[n]ginx' > /tmp/nginx_processes.txt
使用 [n]ginx
来避免匹配 grep
本身的进程。
题目6: 查找并删除指定文件
题目: 使用 find
命令查找 /home/user
目录下所有超过 30 天的 .log
文件,并使用 rm
命令删除这些文件。
答案:
find /home/user -name '*.log' -mtime +30 -exec rm {} +
-mtime +30
用于查找修改时间超过 30 天的文件。
题目7: 移动文件并修改文件名
题目: 使用 mv
命令将 /tmp/oldfile.txt
文件移动到 /home/user/
目录,并将其重命名为 newfile.txt
。
答案:
mv /tmp/oldfile.txt /home/user/newfile.txt
题目8: 查找并计算文件中唯一单词数
题目: 使用 tr
和 sort
命令,将 /home/user/document.txt
文件中的所有单词转换成小写,并统计唯一单词的数量。
答案:
tr '[:upper:]' '[:lower:]' < /home/user/document.txt | tr -c '[:alpha:]' '\n' | sort | uniq | wc -l
tr -c '[:alpha:]' '\n'
用于将非字母字符转换为换行符,从而将单词分开。
题目9: 显示文件中的特定行
题目: 使用 sed
命令从 /etc/hostname
文件中显示第 2 行到第 4 行的内容。
答案:
sed -n '2,4p' /etc/hostname
-n
参数用于禁用默认输出,而 '2,4p'
用于打印第 2 到第 4 行。
题目10: 查找进程并排序
题目: 使用 ps
命令列出所有进程,并使用 sort
对输出按照进程 ID (PID) 进行升序排序。
答案:
ps -e --sort=pid
--sort=pid
选项按照进程 ID 进行排序。
希望这些解答对你有帮助!如果有其他问题或需要进一步解释,请告诉我。
最后编辑:严锋 更新时间:2025-05-09 15:48