【Shell牛客刷题系列】SHELL13 去掉所有包含this的句子:awk与gawk命令的进阶使用
该系列是基于牛客Shell题库,针对具体题目进行查漏补缺,学习相应的命令。
刷题链接:牛客题霸-Shell篇。
该系列文章都放到专栏下,专栏链接为:《专栏:Linux》。欢迎关注专栏~
本文知识预告:
- 首先学习了用于模式扫描和处理语言的
gawk
命令; - 然后结合之前所学的命令,给出了七种方法,值得一学~
题目:SHELL13 去掉所有包含this的句子
编写一个shell脚本以实现如下功能:去掉输入中含有this的语句,把不含this的语句输出。假设输入如下:
that is your bag
is this your bag?
to the degree or extent indicated.
there was a court case resulting from this incident
welcome to nowcoder
你的脚本获取以上输入应当输出:
that is your bag
to the degree or extent indicated.
welcome to nowcoder
说明:你可以不用在意输出的格式,包括空格和换行。
相关命令学习
gawk
命令 – 模式扫描与处理语言
gawk
是Unix中原始awk
程序的GNU版本,强大之处在于可以写脚本来读取文本行的数据,然后处理并显示数据。
语法格式:gawk [参数]
常用参数:
-f | 从文件程序文件读取AWK程序源,而不是从第一个命令行参数。可以使用多个-f 选项 |
---|---|
-F | 指定描绘一行中数据字段的文件分隔符 |
-v | 定义gawk 程序中使用的变量和默认值 |
-mr | 指定数据文件中的最大记录大小 |
参考实例
- 命令行读取程序脚本:
lucky@DESKTOP-VQ8KID4:~$ gawk '{print "hello world"}' nowcoder.txt
hello world
hello world
hello world
hello world
hello world
- 指定描绘一行中数据字段的文件分隔符:
lucky@DESKTOP-VQ8KID4:~$ gawk -F: '{print $1}' /etc/passwd | tail
messagebus
syslog
_apt
tss
uuidd
tcpdump
sshd
landscape
pollinate
lucky
题目解决方案
方法一:grep
命令
grep
命令:-v
显示不包含匹配文本的所有行
lucky@DESKTOP-VQ8KID4:~$ grep -v this nowcoder.txt
that is your bag
to the degree or extent indicated.
welcome to nowcoder
方法二:sed
命令
找出包含this
的行,进行删除,剩下的都是不含this
的行了:
lucky@DESKTOP-VQ8KID4:~$ sed '/this/d' nowcoder.txt
that is your bag
to the degree or extent indicated.
welcome to nowcoder
或者找出包含this
的行,不进行打印
lucky@DESKTOP-VQ8KID4:~$ sed -n '/this/!p' nowcoder.txt
that is your bag
to the degree or extent indicated.
welcome to nowcoder
p
:打印指令d
:删除指令//
:正则表达式
方法三:awk
简单正则匹配
lucky@DESKTOP-VQ8KID4:~$ awk '!/this/{print}' nowcoder.txt
that is your bag
to the degree or extent indicated.
welcome to nowcoder
检查$0
,当其不包含this
时进行输出也是可以的:
lucky@DESKTOP-VQ8KID4:~$ awk '$0!~/this/{print $0}' nowcoder.txt
that is your bag
to the degree or extent indicated.
welcome to nowcoder
方法四:awk
配合for
循环
定义一个flag
变量,来判断每一行是否包含this
,不包含输出即可:
awk '{
flag=0;
for(i=0;i<=NF;i++){
if($i=="this"){
flag=1;
}
}
if(flag!=1){
print $0;
flag=0;
}
}' nowcoder.txt
方法五:awk
配合if
条件语句
lucky@DESKTOP-VQ8KID4:~$ awk '{if($0 !~ /this/){print $0}}' nowcoder.txt
that is your bag
to the degree or extent indicated.
welcome to nowcoder
方法六:gawk
命令
lucky@DESKTOP-VQ8KID4:~$ gawk '!/this/' nowcoder.txt
that is your bag
to the degree or extent indicated.
welcome to nowcoder
方法七:循环
没啥可说的,一行一行的读,不包含this
就进行输出
while read line; do
if [[ $line =~ "this" ]]; then
continue
else
echo $line
fi
done <nowcoder.txt