您的当前位置:首页正文

awk/grep/sed文本三剑客之面试

2024-11-06 来源:个人技术集锦
grep	过滤行
sed 	批量修改文件
awk		格式化输出,报告生成器,逻辑语言

一、grep

二、sed

三、awk

四、三剑客-基础部分题目

1.给定文件中查找与条件相符字符串的命令:
grep

2.正则表达式--常用限定符:
^表示开头,如^abc表示以abc开头的
$表示结尾如abc$表示以abc为结尾的
?表示前一个字符出现0或1次,如ab?c表示a与c之间可有0或1个b存在
+ 表示前一个字符出现0或多次。如ab+c表示a与c之间可有1或多个b存在

3.在当前目录下所有.cc 的文件中找到含有“oldboy”内容的文件:
find -type f -name '*.cc' | xargs grep -l "oldboy"
find -type f -name '*.cc' -exec grep -l "oldboy" {} \;
-l --file-with-matches # 列出文件内容符合指定的范本样式的文件名称
-r 递归查询

4.找出当前目录下包含127.0.0.1关键字的文件
grep '127.0.0.1' `find . -type f `
sed -n '/127.0.0.1/p' `find . -type f`
awk '/127.0.0.1/' `find . -type f`

5.删除/显示1.file 文件第3行到第7行的内容
删除:
sed -i '3,7d' 1.file  
awk '(NR>=3&&NR<=7)' 1.file  把第三行到第七行排除

显示:
sed -n '3,7p' 1.file 
awk 'NR==3,NR==7' 1.file 
awk 'NR>=3 && NR<=7' 1.file 
head -7 1.file | tail -5
1.使用awk取出/etc/passwd第一列数据也就是取出用户名。
awk -F : '{print $1}' /etc/passwd
sed 's#:.*$##g' /etc/passwd

2.用命令行更改config.txt文件,把里面所有的“name”更改为“address”
sed -i 's#name#address#g' config.txt
vim config.txt
	:%s#name#address#g
awk '{gsub(/name/,""address)}1' config.txt

3.写出查询file.txt以abc结尾的行
grep 'abc$' file.txt
sed -n '/abc$/p' file.txt
awk '/abc$/' file.txt

4.删除file.txt文件中的空行
grep -v '^$' file.txt
sed '/^$/d' file.txt
awk '!/^$/' file.txt
文件中的空行可能是只有空格的行:
grep -v '^ *$' file.txt
sed -n '/^ *$/p' file.txt
awk '/^ *$/' file.txt

5.打印file.txt文件中的第10行
sed -n '10p' file.txt
head -10 file.txt| tail -1
awk 'NR=10' file.txt
1.删除/etc/fstab文件中所有以#开头的行,行首的#号及#后面的所有空白字符

2.查找最后修改时间是3天前,后缀是*.log的文件并删除
find /tmp/ -type -f -mtime -3 -name "*.log" | xargs rm -f
find /tmp/ -type -f -mtime -3 -name "*.log" -exec rm -f {} \;
find /tmp/ -type f -mtime +3 -name '*.log' -exec rm {} +

\; -exec find 命令找出 1 个文件就把文件放在{}的位置
+;如果-exec后面使用+ find会把前面找到的所有文件1次性的放在{}所在位置

3.查找文件中1到20行之间,同时将"aaa"替换为"AAA",“ddd"替换"DDD”
sed '1,20y/ad/AD/' 2.txt
sed -ne 's#a#A#g;s#d#D#g;1,20p' 2.txt 

4.使用sed命令打印出文件的第一行到第三行
ed -n '1,3p'  file.txt
awk 'NR>=1&&NR<=3' file.txt
head -3  file.txt

5.在/var/sync/log/cef_watchd-20080424.1og文件中查找大小写不敏感“mysql"字符串中的命令是:
grep -iw 'mysql' /var/sync/log/cef_watchd-20080424.1og

1.把data目录及其子目录下所有以扩展名.txt结尾的文件中包含oldgirl的字符串全部替换为oldboy.
sed -i 's#oldgirl#oldboy#g' `find /data/ -type f -name '*.txt'`

2.查看linux服务器ip的命令,同时只显示包含ip所在的行打印出来
ip a s ens33 | sed -n '3p' | sed -r 's#^.*t ([0-9].*)/.*$#\1#g'
ip a s ens33 | sed -n '3p' | awk '{print $2;}' | awk -F / '{print $1;}'
sed语法:-r  使用正则表达式 

3.用awk获取文件中第三行的倒数第二列字段
awk 'NR==3{print $(NF-1)}' file.txt

4.请用shell查询file1里面空行的所在行号
grep -n '^$' file.txt
awk '/^$/{print NR,$0}' file1.txt

5.显示file文件里匹配foo字串那行以及上下5行、显示foo及前5行、显示foo及后5行
grep -A5 'foo'	file.txt		后5行
grep -B5 'foo'  file.txt		前5行
grep -C5 'foo' 	file.txt		上下5行
1.查找file.log文件中的包含关键字“helloworld”的内容,及其上下两行的内容重定向保存到1.txt
grep -C2  'helloworld' file.log >> 5.txt

2.当前系统中没有任何文本编辑器(vi,emacs,vim,edit等),如何过滤掉注释行和空行查看/etc/ssh/sshd_config文件
sed -r '/^#|^$/d' /etc/ssh/sshd_config
awk '!/^$|^#/' /etc/ssh/sshd_config 

3.从a.log文件中提取包含“WARNING”或“FATAL”,同时不包含“IGNOR”行,然后,提取以“:”分割的第五个字段
awk -F:  '/WARNING|FATAL/&&!/IGNOR/{print $5}'

4.文件内容排序、文件行取唯一值的命令分别是
sort
uniq   除文件中的重复内容行

5.awk统计当前主机的并发访问量
netstat -ant | awk '/^tcp/ {++state[$NF]} END {for(key in state) print key,"\t",state[key]}'
LISTEN   14
ESTABLISHED      2
SYN_SENT         1
显示全文