该系列是基于牛客Shell题库,针对具体题目进行查漏补缺,学习相应的命令。

刷题链接:牛客题霸-Shell篇。

该系列文章都放到专栏下,专栏链接为:《专栏:Linux》。欢迎关注专栏~

本文知识预告:

  • 首先复习了headtailsed命令的相关语法知识;
  • 然后给出五种题目解决方案,基本都是之前的题目中遇到过的知识点。


题目:SHELL4 输出第5行的内容

编写一个bash脚本以输出一个文本文件nowcoder.txt中第5行的内容。假设 nowcoder.txt 内容如下:

welcome
to
nowcoder
this
is
shell
code

相关命令学习

awk:文本和数据进行处理的编程语言

awk命令来自于三位创始人”Alfred Aho,Peter Weinberger, Brian Kernighan “的姓氏缩写,其功能是用于对文本和数据进行处理的编程语言。使用awk命令可以让用户自定义函数或正则表达式对文本内容进行高效管理,与sedgrep并称为Linux系统中的文本三剑客。

语法格式awk 参数 文件

常用参数

参数 功能
-F 指定输入时用到的字段分隔符
-v 自定义变量
-f 从脚本中读取awk命令
-m val值设置内在限制

常用的awk内置变量

awk语法由一系列条件和动作组成,在花括号内可以有多个动作,多个动作之间用分号分隔,在多个条件和动作之间可以有若干空格,也可以没有。

变量名称 说明
FILENAME 当前输入文档的文件名
FNR 当前输入文档的当前行号,尤其当多个输入文档时有用
FS 设置字段分隔符,默认为空格或制表符
NF 当前记录(行)的字段(列)个数
NR 输入数据流的当前记录数(行号)
OFS 输出字段分隔符,默认为空格
ORS 输出记录分隔符,默认为换行符
RS 输入记录分隔符,默认为换行符

awk是一种处理文本文件的编程语言,文件的每行数据都被称为记录默认以空格或制表符为分隔符每条记录被分成若干字段(列)awk每次从文件中读取一条记录

例子:

  1. 仅显示指定文件中第1、2列的内容(默认以空格为间隔符):
lucky@DESKTOP-VQ8KID4:~/shell$ awk '{print $1,$2}' nowcoder.txt
#include <iostream>
using namespace
int main()
{int a
int b
cout <<
return 0;
}
  1. 以冒号为间隔符,仅显示指定文件中第1列的内容:
lucky@DESKTOP-VQ8KID4:~/shell$ awk -F : '{print $1,$2}' /etc/passwd
root x
daemon x
bin x
...
tcpdump x
sshd x
landscape x
pollinate x
lucky x

/etc/passwd文件中的内容由:分隔开。

  1. 以冒号为间隔符,显示系统中所有UID号码大于500的用户信息(第3列):
lucky@DESKTOP-VQ8KID4:~/shell$ awk -F : '$3>=500' /etc/passwd
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
lucky:x:1000:1000:,,,:/home/lucky:/bin/bash
  1. 仅显示指定文件中含有指定关键词main的内容:
lucky@DESKTOP-VQ8KID4:~/shell$ awk '/main/{print}' nowcoder.txt
int main()
  1. 以冒号为间隔符,仅显示指定文件中最后一个字段的内容:
lucky@DESKTOP-VQ8KID4:~/shell$ awk -F : '{print $NF}' /etc/passwd
/bin/bash
/usr/sbin/nologin
/usr/sbin/nologin
...
/usr/sbin/nologin
/bin/false
/bin/bash
  1. 输出行号,NR将所有文件的数据视为一个数据流,而FNR则是将多个文件的数据视为独立的若干个数据流,遇到新文件时行号从1开始重新递增。
lucky@DESKTOP-VQ8KID4:~$ awk '{print NR}' first.txt three.sh
1
2
3
lucky@DESKTOP-VQ8KID4:~$ awk '{print FNR}' first.txt three.sh
1
1
2

tail:查看文件尾部内容

tail命令的功能是用于查看文件尾部内容,例如默认会在终端界面上显示出指定文件的末尾十行,如果指定了多个文件,则会在显示的每个文件内容前面加上文件名来加以区分。

高阶玩法的-f参数作用是持续显示文件的尾部最新内容,类似于机场候机厅的大屏幕,总会把最新的消息展示给用户,对阅读日志文件尤为适合,而不需要手动刷新。

语法格式:tail [参数] 文件

常用参数:

参数 功能
-c 输出文件尾部的N(N为整数)个字节内容
-f 持续显示文件最新追加的内容
-F <N> 与选项“-follow=name”和“–retry”连用时功能相同
-n <N> 输出文件的尾部N(N位数字)行内容
--retry 即是在tail命令启动时,文件不可访问或者文件稍后变得不可访问,都始终尝试打开文件
--pid 与“-f”选项连用,当指定的进程号的进程终止后,自动退出tail命令
--help 显示指令的帮助信息
  1. 实时输出文件的最新更新内容
tail -f nowcoder.txt
  1. 输出文件的最后5行
tail -n 5 nowcoder.txt   # tail -5 nowcoder.txt
  1. 输出从第5行开始到文件结尾的内容
tail -n +5 nowcoder.txt
  1. 输出从倒数第五行开始到文件结尾的内容
tail -n -5 nowcoder.txt
  1. 不加任何参数,默认输出10行
tail nowcoder.txt
  1. 表示输出文件最后5个字节
tail -c 5 nowcoder.txt

head:显示文件开头的内容

head命令的功能是显示文件开头的内容,默认为前10行。

语法格式:head [参数] 文件

常用参数:

-n <数字> 定义显示行数
-c <数字> 指定显示头部内容的字符数
-v 总是显示文件名的头信息
-q 不显示文件名的头信息
  1. 默认显示文件的前10行内容:
lucky@DESKTOP-VQ8KID4:~$ head nowcoder.txt
welcome
to
nowcoder
this
is
shell
code
  1. 显示文件名的头信息
lucky@DESKTOP-VQ8KID4:~$ head -v nowcoder.txt
==> nowcoder.txt <==
welcome
to
nowcoder
this
is
shell
code
  1. 指定显示文件的前5行内容:
lucky@DESKTOP-VQ8KID4:~$ head -n 5 nowcoder.txt
welcome
to
nowcoder
this
is

sed:批量编辑文本文件

sed命令来自于英文词组“stream editor”的缩写,其功能是用于利用语法/脚本对文本文件进行批量的编辑操作。sed命令最初由贝尔实验室开发,后被众多Linux系统接纳集成,能够通过正则表达式对文件进行批量编辑,让需要重复的工作不再浪费时间。

sed是非交互式的编辑器。它不会修改文件,除非使用shell重定向来保存结果。默认情况下,所有的输出行都被打印到屏幕上。sed编辑器逐行处理文件(或输入),并将结果发送到屏幕。

sed命令行格式为:

sed [-nefri] ‘command’ 输入文本

常用选项:

  • -n:使用安静(silent)模式。在一般 sed的用法中,所有来自STDIN的资料一般都会被列出到萤幕上。但如果加上-n 参数后,则只有经过sed特殊处理的那一行(或者动作)才会被列出来。
  • -e:直接在指令列模式上进行 sed 的动作编辑;
  • -f:直接将 sed 的动作写在一个档案内, -f filename则可以执行 filename 内的sed 动作;
  • -rsed的动作支援的是延伸型正规表示法的语法。(预设是基础正规表示法语法)
  • -i:直接修改读取的档案内容,而不是由萤幕输出。

常用命令:

  • a:新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
  • c:取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
  • d:删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
  • i:插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
  • p:列印,亦即将某个选择的资料印出。通常 p 会与参数 sed -n一起运作~
  • s:取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g!
  • g:是行内进行全局替换

常用参数:

参数 功能
-e 以指定的脚本来处理输入的文本文件
-f<script文件> 以指定的脚本文件来处理输入的文本文件
-h 显示帮助
-n 仅显示script处理后的结果
-V 显示版本信息

参考实例

  1. 查找指定文件中带有某个关键词的行:
lucky@DESKTOP-VQ8KID4:~/shell$ sed -n '/main/p' nowcoder.txt
int main()
  1. 替换指定文件中某个关键词成大写形式:
lucky@DESKTOP-VQ8KID4:~/shell$ sed 's/int/INT/g' nowcoder.txt
#include <iostream>
using namespace std;
INT main()
{INT a = 10;INT b = 100;cout << "a + b:" << a + b << endl;return 0;
}

有点巧,这和前面学的Vim里面的替换基本一样。

  1. 读取指定文件,删除所有带有某个关键词的行:
lucky@DESKTOP-VQ8KID4:~/shell$ sed '/int/d' nowcoder.txt
#include <iostream>
using namespace std;
{cout << "a + b:" << a + b << endl;return 0;
}
  1. 读取指定文件,在第4行后插入一行新内容:
lucky@DESKTOP-VQ8KID4:~/shell$ sed -e '4a\    cout << "hello world" << end;' nowcoder.
txt
#include <iostream>
using namespace std;
int main()
{cout << "hello world" << end;int a = 10;int b = 100;cout << "a + b:" << a + b << endl;return 0;
}
  1. 读取指定文件,在第4行后插入多行新内容:
lucky@DESKTOP-VQ8KID4:~/shell$ cat nowcoder.txt | sed -e '4a\    cout << "hello world"<< endl; \n    cout << "hello aha" << endl;'
#include <iostream>
using namespace std;
int main()
{cout << "hello world" << endl;cout << "hello aha" << endl;int a = 10;int b = 100;cout << "a + b:" << a + b << endl;return 0;
}
  1. 读取指定文件,删除第2-5行的内容:
lucky@DESKTOP-VQ8KID4:~/shell$ cat -n nowcoder.txt | sed '2,5d'1  #include <iostream>6      int b = 100;7      cout << "a + b:" << a + b << endl;8      return 0;9  }
  1. 读取指定文件,替换第2-5行的内容:
lucky@DESKTOP-VQ8KID4:~/shell$ sed '2,5c cout << "gaga" << endl;' nowcoder.txt
#include <iostream>
cout << "gaga" << endl;int b = 100;cout << "a + b:" << a + b << endl;return 0;
}
  1. 指定读取某个文件的第3-7行:
lucky@DESKTOP-VQ8KID4:~/shell$ sed -n '3,7p' nowcoder.txt
int main()
{int a = 10;int b = 100;cout << "a + b:" << a + b << endl;

总结:head从头开始打印tail从尾开始打印sed从中间开始打印

题目解决方案

方法一:head命令+tail命令

先读取文件前五行,再读取最后一行的内容

head -n 5 nowcoder.txt | tail -n1

方法二:sed命令读取任意行

sed命令中的 p 子命令,打印第五行

sed -n '5p' nowcoder.txt

方法三:awk直接取出第5行信息

awk -n "NR==5" nowcoder.txt

方法四:awk匹配第五行

NR==5匹配第五行;{}中放匹配后要执行的命令,$0输出行的所有内容

awk 'NR==5{print $0}' ./nowcoder.txt

方法五:循环

#!/bin/bash
line=1
while read value
doif [ $line -eq 5 ]thenecho $valuefilet line++
done < nowcoder.txt

照旧,这个方法用时最短!

【Shell牛客刷题系列】SHELL4 输出第5行的内容:回顾head、tail命令和sed、awk命令的使用相关推荐

  1. 【Shell牛客刷题系列】SHELL5 打印空行的行号:一起学习grep命令搭配正则表达式的使用

    该系列是基于牛客Shell题库,针对具体题目进行查漏补缺,学习相应的命令. 刷题链接:牛客题霸-Shell篇. 该系列文章都放到专栏下,专栏链接为:<专栏:Linux>.欢迎关注专栏~ 本 ...

  2. 【Shell牛客刷题系列】SHELL21 格式化输出:来看个printf命令的小彩蛋~

    该系列是基于牛客Shell题库,针对具体题目进行查漏补缺,学习相应的命令. 刷题链接:牛客题霸-Shell篇. 该系列文章都放到专栏下,专栏链接为:<专栏:Shell>.欢迎关注专栏~ 本 ...

  3. 【Shell牛客刷题系列】SHELL1 统计文件的行数:学习wc命令和文本三剑客awk、grep、sed命令

    该系列是基于牛客Shell题库,针对具体题目进行查漏补缺,学习相应的命令. 刷题链接:牛客题霸-Shell篇. 该系列文章都放到专栏下,专栏链接为:<专栏:Linux>.欢迎关注专栏~ 本 ...

  4. 【C/C++牛客每日必刷】--- 牛客刷题系列

    个人名片:

  5. 牛客刷题日记(2021-12-8)

    牛客刷题日记(2021-12-8) 题目: 以下哪个接口的定义是正确的?( )interface B { void print() { } ;}interface B { static void pr ...

  6. 【牛客刷题专栏】0x27:JZ29 顺时针打印矩阵(C语言编程题)

    前言 个人推荐在牛客网刷题(点击可以跳转),它登陆后会保存刷题记录进度,重新登录时写过的题目代码不会丢失. 个人刷题练习系列专栏:个人CSDN牛客刷题专栏. 题目来自:牛客/题库 / 在线编程 / 剑 ...

  7. 牛客刷题日记(2021-11-24)

    牛客刷题日记(2021-11-24) 题目: 下面程序的输出是:() String x="fmn"; x.toUpperCase(); String y=x.replace('f' ...

  8. 最长上升子序列(LIS),牛客刷题

    目录: 最长上升子序列(LIS) 1.模板(数据较小) 2.模板(数据较大) 牛客刷题 1. 牛客练习赛107A:如见青山 2.牛客小白月赛65A牛牛去购物 3.牛客小白月赛65B牛牛去购物 4.牛客 ...

  9. 牛客刷题-Java面试题库【动态更新添加题目】(2023.06.19更新)

    讲在前面 ✨ 牛客刷题日记–理解为重中之重 刷题一方面是持续的了解到自己哪方面比较欠缺,另一方面也是从各大厂的面试题可以看出当前所需的技术栈的偏重点,持续的巩固基础和查漏补缺,一如代码深似海–学无止境 ...

最新文章

  1. Confluence 6 重要缓存和监控
  2. Elasticsearch Java Client 版本区别及起步(5.X 和6.X)
  3. FreeRTOS列表
  4. 相对路径 ‘’,‘/’,‘./‘,‘../‘
  5. 代码注释(图案:女孩儿)
  6. [Node.js] mySQL数据库 -- 英雄英雄管理系统接口
  7. 数论之神 HYSBZ - 2219 (原根+指标+bsgs+crt+exgcd+思维)
  8. 计算机的组成 —— 显示器
  9. DTW算法(语音识别)
  10. 信息技术导论——信息和信息系统习题整理
  11. 主板24pin接口详图_老电源也兼容 简单DIY 24Pin转接线
  12. 演讲稿:遇见下班加油站,开启改变之路(不喜者勿入)
  13. 《气候宣言》宣布100多家签约组织,承诺至2040年或更早实现净零碳排放
  14. Linux软件安装包保存
  15. 小米电视内存不足及卸载自带软件开机广告
  16. filebeat+logstash收集错误日志发送邮件提醒
  17. 【六祎 - HTML模板】提交按钮模板-带特效
  18. Android11 DHCP初识
  19. 解决viewpager setCurrentItem 白屏问题
  20. Opencv(C++)系列学习---opencv_contrib安装

热门文章

  1. 正态分布为何如此重要?
  2. nginx-host绕过实例复现
  3. 3dmax:3dmax三维VR渲染设置之高级灯光渲染(经典案例—利用自由聚光灯制作筒灯效果效果)图文教程
  4. python123.io作业_python成长之路-----day1-----作业(登录程序和三级菜单)
  5. Hadoop的搭建与使用
  6. S32K SDK使用详解之S32 SDK软件架构详解
  7. 网易云音乐怎么设置黑胶唱片_黑胶唱片是否是开放音乐格式?
  8. mysql query 优化_第 8 章 MySQL 数据库 Query 的优化
  9. android换苹果,苹果换手机怎么转移数据?苹果、安卓都可以一键转移数据
  10. 人生感悟:如何与别人合作共同创业