练习一

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个问题,包含了具体的文件和文件格式要求。这些题目将涉及到管道、复杂的文本处理流程和正则表达式的使用。

  1. 统计访问次数

场景: 统计一个日志文件中特定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排序。

  1. 脱敏处理手机号码

场景: 将一个文件中所有的手机号码替换为脱敏处理的格式(例如:【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’

  1. 提取并排序电子邮件地址

场景: 从一个文件中提取出所有的电子邮件地址,并按字母顺序排序。

文件: 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’

  1. 提取并排序URL链接

场景: 将一个文件中的所有URL链接提取出来,并按照访问次数进行排序。

文件: websites.txt

文件格式: 每行记录包含URL链接和访问次数,以空格分隔。

示例文件内容:

http://example1.com 100
https://example2.com 50
https://example3.com 200
http://example4.com 75
  1. 提取错误日志

场景: 从一个日志文件中提取出所有发生错误的行,并将它们写入一个新的文件。

文件: 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
  1. 转换英文单词格式

场景: 将一个文件中所有的英文单词转换为首字母大写的格式。

文件: text.txt

文件格式: 每行记录包含一段文字。

示例文件内容:

this is a sample text
to demonstrate the exercise
of converting words to title case
  1. 统计单词出现次数

场景: 统计一个文件中每个单词出现的次数,并按照出现次数进行排序。

文件: words.txt

文件格式: 每行记录包含一个单词。

示例文件内容:

apple
banana
orange
apple
banana
banana
orange
  1. 提取并排序日期

场景: 从一个文件中提取出所有的日期,并按照日期顺序进行排序。

文件: dates.txt

文件格式: 每行记录包含日期和事件描述,以制表符分隔。

示例文件内容:

2021-01-01    Event 1
2021-02-01    Event 2
2021-03-01    Event 3
2021-01-15    Event 4
  1. 删除HTML标签

场景: 将一个文件中的所有HTML标签删除,并将纯文本保存到一个新的文件中。

文件: page.html

文件格式: 包含HTML标记的网页文件。

示例文件内容:

<html>
<body>
<h1>Title</h1>
<p>This is a paragraph.</p>
</body>
</html>
  1. 提取并排序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的使用,并加深他们对文本处理和正则表达式的理解。

答案

以下是题目的答案:

  1. 统计访问次数
cat access.log | grep "192.168.0.1" | wc -l
  1. 脱敏处理手机号码
sed -E 's/([0-9]{3})[0-9]{4}([0-9]{4})/\1****\2/g' data.txt
  1. 提取并排序电子邮件地址
grep -oE '[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}' contacts.txt | sort
  1. 提取并排序URL链接
grep -oE 'http[s]?://[^ ]+' websites.txt | sort -k2,2nr
  1. 提取错误日志
grep "Error" error.log > error.txt
  1. 转换英文单词格式
cat text.txt | sed -E 's/\<./\U&/g'
  1. 统计单词出现次数
cat words.txt | sort | uniq -c | sort -k1,1nr
  1. 提取并排序日期
cut -f1 dates.txt | sort
  1. 删除HTML标签
sed -E 's/<[^>]*>//g' page.html > text.txt
  1. 提取并排序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道综合性题目:

  1. 创建一个名为data.txt的文本文件,并写入以下内容:

    Name: John
    Age: 25
    Email: john@example.com
  2. data.txt文件中提取出姓名,并将结果保存到name.txt文件中。

  3. data.txt文件中提取出邮箱,并将结果保存到email.txt文件中。

  4. data.txt文件中,将所有的冒号(:)替换为空格,并将结果保存到data_modified.txt文件中。

  5. 创建一个名为numbers.txt的文本文件,并写入以下内容:

    1
    22
    333
    4444
    55555
  6. 统计numbers.txt文件中每行数字的位数,并将结果保存到digit_count.txt文件中。

  7. numbers.txt文件中,将所有的数字都乘以2,并将结果保存到doubled_numbers.txt文件中。

  8. 创建一个名为words.txt的文本文件,并写入以下内容:

    apple
    banana
    carrot
    dog
    elephant
  9. words.txt文件中的每个单词转换为首字母大写,并将结果保存到capitalized_words.txt文件中。

  10. 创建一个名为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.
  11. log.txt文件中提取出所有的错误信息,并将结果保存到errors.txt文件中。

  12. 统计log.txt文件中每个时间段内的日志数量,并将结果保存到log_count.txt文件中。

  13. 创建一个名为students.csv的CSV文件,并写入以下内容:

    Name,Age,Grade
    John,25,A
    Alice,22,B
    Michael,24,A
  14. students.csv文件中提取出所有年龄大于等于23岁的学生信息,并将结果保存到older_students.csv文件中。

  15. students.csv文件中,将所有的年级都替换为大写字母,并将结果保存到uppercase_grades.csv文件中。

  16. 创建一个名为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: 查找并计算文件中唯一单词数

题目: 使用 trsort 命令,将 /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 进行排序。

希望这些解答对你有帮助!如果有其他问题或需要进一步解释,请告诉我。

作者:严锋  创建时间:2023-09-13 11:40
最后编辑:严锋  更新时间:2025-05-09 15:48