【Shell牛客刷题系列】SHELL20 打印只有一个数字的行:awk叫上正则表达式好兄弟来刷题~

2023-11-08



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

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

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

本文知识预告:

  • 本文首先学习了正则表达式和awk命令的相关的用法;
  • 然后,给出了三种题目的解决方案,基本算是前面题目都用到过的知识点。


题目:SHELL20 打印只有一个数字的行

假设有一个nowcoder.txt,编写脚本,打印只有一个数字的行。假设nowcoder.txt内容如下:

haha
1
2ab
cd

那么你的脚本应该输出

1
2ab

相关命令学习

正则表达式

正则表达式为高级的文本模式匹配抽取、与/或文本形式的搜索替换功能提供了基础。简单地说,正则表达式是一些由字符和特殊符号组成的字符串,它们描述了模式的重复或者表述多个字符,于是正则表达式能按照某种模式匹配一系列有相似特征的字符串。

正则表达式的强大之处在于引入特殊字符来定义字符集、匹配子组和重复模式。正是由于这些特殊符号,使得正则表达式可以匹配字符串集合,而不仅仅只是某单个字符串。下面列出最常见的符号和字符。

常见的符号

表示法 描述 正则表达式示例
literal 匹配文本字符串的字面值literal foo
re1\\|re2 匹配正则表达式re1 或者 re2 foo|bar
. 匹配任何字符(除了\\n之外) b.b
^ 匹配字符串起始部分 ^Dear
$ 匹配字符串终止部分 /bin/*sh$
* 匹配 0 次或者多次前面出现的正则表达式 [A-Za-z0-9]*
+ 匹配 1 次或者多次前面出现的正则表达式 [a-z]+.com
? 匹配 0 次或者 1 次前面出现的正则表达式 goo?
{N} 匹配 N 次前面出现的正则表达式 [0-9]{3}
{M,N} 匹配 M~N 次前面出现的正则表达式 [0-9]{5,9}
[…] 匹配来自字符集的任意单一字符 [aeiou]
[..x−y..] 匹配 x~y 范围中的任意单一字符 [0-9], [A-Za-z]
[^…] 不匹配此字符集中出现的任何一个字符,包括某一范围的字符 [^aeiou], [^A-Za-z0-9]

常见的特殊字符

表示法 描述 正则表达式示例
literal 匹配文本字符串的字面值literal foo
re1\\|re2 匹配正则表达式re1 或者 re2 foo|bar
. 匹配任何字符(除了\\n之外) b.b
^ 匹配字符串起始部分 ^Dear
$ 匹配字符串终止部分 /bin/*sh$
* 匹配 0 次或者多次前面出现的正则表达式 [A-Za-z0-9]*
+ 匹配 1 次或者多次前面出现的正则表达式 [a-z]+.com
? 匹配 0 次或者 1 次前面出现的正则表达式 goo?
{N} 匹配 N 次前面出现的正则表达式 [0-9]{3}
{M,N} 匹配 M~N 次前面出现的正则表达式 [0-9]{5,9}
[…] 匹配来自字符集的任意单一字符 [aeiou]
[..x−y..] 匹配 x~y 范围中的任意单一字符 [0-9], [A-Za-z]
[^…] 不匹配此字符集中出现的任何一个字符,包括某一范围的字符 [^aeiou], [^A-Za-z0-9]

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每次从文件中读取一条记录

题目解决方案

方法一:awk

思路很简单,以0-9的数字做分割,判断每行有多少列,即可筛选出题目要求的内容(两列)

awk -F "[0-9]" '{if(NF==2) print $0}' nowcoder.txt

方法二:正则表达式

结合上面给出的正则表达式的用法,根据这道题目,可以利用正则表达式匹配出我们所需要的内容:

  1. 以数字开头,非数字结尾
'^[0-9]([a-zA-z]+)$'
  1. 以字母开头,数字结尾
'^([z-zA-Z])*[0-9]$'
  1. 以字母开头,字母结尾,中间一个数字
'^([a-zA-Z])*[0-9]([a-zA-Z])*$'

所以题目的解决方案为:

awk '/(^[0-9]([a-z]+)$)|(^[a-z]*[0-9]$)|(^[a-z][0-9][a-z]$)/' nowcoder.txt

方法三:while

while read line; do
	let count=0
	for ((i = 0; i < ${#line}; i++)); do
		[[ ${line:i:1} =~ [0-9] ]] && ((count++))
	done
	if [ $count -eq 1 ]; then
		printf "$line\n"
	fi
done <nowcoder.txt
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Shell牛客刷题系列】SHELL20 打印只有一个数字的行:awk叫上正则表达式好兄弟来刷题~ 的相关文章

  • 在哪里可以找到并安装 pygame 的依赖项?

    我对 Linux 比较陌生 正在尝试安装 python 的 pygame 开发环境 当我运行 setup py 时 它说我需要安装以下依赖项 我找到并安装了其中之一 SDL 然而 其他人则更加难以捉摸 Hunting dependencie
  • 域套接字“sendto”遇到“errno 111,连接被拒绝”

    我正在使用域套接字从另一个进程获取值 就像 A 从 B 获取值一样 它可以运行几个月 但最近 A 向 B 发送消息时偶尔会失败 出现 errno 111 连接被拒绝 我检查了B域套接字绑定文件 它是存在的 我也在另一台机器上做了一些测试 效
  • 加载数据infile,Windows和Linux的区别

    我有一个需要导入到 MySQL 表的文件 这是我的命令 LOAD DATA LOCAL INFILE C test csv INTO TABLE logs fields terminated by LINES terminated BY n
  • Android 时钟滴答数 [赫兹]

    关于 proc pid stat 中应用程序的总 CPU 使用率 https stackoverflow com questions 16726779 total cpu usage of an application from proc
  • 有没有办法让我简化这些回声? [复制]

    这个问题在这里已经有答案了 我仍在学习如何编写 shell 脚本 并且我面临着一个挑战 让我更容易回显 Name1 Name2 Name15 我不太确定从哪里开始 我已经想法 但如果我搞砸了 我不想看起来很傻 有什么帮助吗 我实际上还没有尝
  • linux perf:如何解释和查找热点

    我尝试了linux perf https perf wiki kernel org index php Main Page今天很实用 但在解释其结果时遇到了困难 我习惯了 valgrind 的 callgrind 这当然是与基于采样的 pe
  • OSX bash 最小化窗口

    在 Mac 中并使用 bash shell 我想执行一个包含单个命令 启动 Jupyter Lab 的文件并立即最小化终端窗口 有没有办法在不安装第三方软件的情况下做到这一点 是的 只需使用osascript https ss64 com
  • 如何在 Linux shell 中将十六进制转换为 ASCII 字符?

    假设我有一个字符串5a 这是 ASCII 字母的十六进制表示Z 我需要找到一个 Linux shell 命令 它将接受一个十六进制字符串并输出该十六进制字符串代表的 ASCII 字符 所以如果我这样做 echo 5a command im
  • NPTL 和 POSIX 线程有什么区别?

    NPTL 和 POSIX 线程之间的基本区别是什么 这两者是如何演变的 POSIX 线程 pthread 不是一个实现 它是几个函数的 API 规范 纸上的标准 英文 其名称以pthread 以及定义在
  • os.Mkdir 和 os.MkdirAll 权限

    我正在尝试在程序开始时创建一个日志文件 我需要检查是否 log如果不创建目录 则目录存在 然后继续创建日志文件 好吧 我尝试使用os Mkdir 也os MkdirAll 但无论我在第二个参数中输入什么值 我都会得到一个没有权限的锁定文件夹
  • 安装J语言的JQt IDE,出现错误

    我一直按照这里的说明进行操作 http code jsoftware com wiki System Installation Linux http code jsoftware com wiki System Installation L
  • 使用 sh 运行 bash 脚本

    我有 bash 脚本 它需要 bash 另一个人尝试运行它 sh script name sh 它失败了 因为 sh 是他的发行版中 dash 的符号链接 ls la bin sh lrwxrwxrwx 1 root root 4 Aug
  • 如何通过保持目录结构完整来同步路径中匹配模式的文件?

    我想将所有文件从服务器 A 复制到服务器 B 这些文件在不同级别的文件系统层次结构中具有相同的父目录名称 例如 var lib data sub1 sub2 commonname filetobecopied foo var lib dat
  • 从 UNIX 命令行向串行端口发送字节?

    我想使用命令行将字节流发送到串行端口 这可能吗 我的串口位于 dev cu usbserial A700dYoR在我的 Mac 上 例如 如果我想将整数 50 或字符串 data 发送到该串行端口 我该怎么做 我对 UNIX 的了解非常有限
  • SSE:跨页边界的未对齐加载和存储

    我在页面边界旁边执行未对齐加载或存储之前读过某处 例如使用 mm loadu si128 mm storeu si128内在函数 代码应首先检查整个向量 在本例中为 16 个字节 是否属于同一页 如果不属于同一页 则切换到非向量指令 我知道
  • 在我的 index.php 中加载 CSS 和 JS 等资源时出现错误 403

    我使用的是 Linux Elementary OS 并在 opt 中安装了 lampp My CSS and JS won t load When I inspect my page through browser The console
  • docker容器大小远大于实际大小

    我正在尝试从中构建图像debian latest 构建后 报告的图像虚拟大小来自docker images命令为 1 917 GB 我登录查看尺寸 du sh 大小为 573 MB 我很确定这么大的尺寸通常是不可能的 这里发生了什么 如何获
  • 多处理:仅使用物理核心?

    我有一个函数foo它消耗大量内存 我想并行运行多个实例 假设我有一个有 4 个物理核心的 CPU 每个核心有两个逻辑核心 我的系统有足够的内存来容纳 4 个实例foo并行但不是 8 个 此外 由于这 8 个核心中的 4 个是逻辑核心 我也不
  • 查找哪个程序运行另一个程序

    我有一个 NAS 运行在 Redhat Linux 的有限版本上 我按照指示破解了它 这样我就可以访问 shell 这很有帮助 我还做了一些修改 其他人也做过修改 除了一个问题之外 它们似乎都工作得很好 不知何故 每隔 22 天 系统就会关
  • 如何通过ssh检查ubuntu服务器上是否存在php和apache

    如何通过ssh检查Ubuntu服务器上apache是 否安装了php和mysql 另外如果安装的话在哪个目录 如果安装了其他软件包 例如 lighttpd 那么它在哪里 确定程序是否已安装的另一种方法是使用which命令 它将显示您正在搜索

随机推荐

  • Sqlite学习笔记(四)&&SQLite-WAL原理 Write ahead logging

    Sqlite学习笔记 四 SQLite WAL原理 转 2015 08 24 21 55 by 沧海一滴 90 阅读 0 评论 收藏 编辑 Sqlite学习笔记 三 WAL性能测试中列出了几种典型场景下WAL的性能数据 了解到WAL确实有性
  • linux下QT源码安装简书,QT Creator 5在linux下的安装及问题(libCore.so无法加载)的解决...

    Qt 以其开源 免费 完全面向对象 很容易扩展 允许真正的组件编程以及可移植跨平台等诸多优势得到越来越多的开发人员的青睐 Qt Creator 是 Nokia 官方推出的专门针对 Qt 开发的 IDE 本文详细介绍了 Linux 下 Qt
  • QT 多线程信号与槽(一)

    QT 中 QObject 作QT中类的最终父类 具有自定义信号与槽的能力 只要继承自这个类的类 也一样拥有自定义信号和槽的能力 QT 中定义信号与槽是十分有用的 那我们的线程类是不是也有这个能力呢 查一下 QThread 的源码 我们发现
  • 利用Xming X Server使用服务器上使用kettle

    Xming X Server安装部署 1 下载 http sourceforge net project showfiles php group id 156984 Xming 6 9 0 31 用OpenGL展示界面 Xming font
  • 电源抑制比(PSRR )

    如果运算放大器的电源发生变化 输出不应变化 但实际上通常会发生变化 如果X V的电源电压变化产生Y V的输出电压变化 则该电源的PSRR 折合到输出端 为X Y 无量纲比通常称为电源电压抑制比 PSRR 以dB表示时则称为电源电压抑制 PS
  • This system is not registered with RHN问题解决

    1 问题 公司有一台服务器 因为一直用的是centos的系统 但是那个分中心没有现成centos的系统 问我红帽5 3的能行吗 我说试一试 然后在配置yum源的时候就遇到了问题 提示如下错误 这是因为这个系统没有在红帽注册 所以不能用yum
  • 谷歌云

    Cloud Ace 是谷歌云全球战略合作伙伴 拥有 300 多名工程师 也是谷歌最高级别合作伙伴 多次获得 Google Cloud 合作伙伴奖 作为谷歌托管服务商 我们提供谷歌云 谷歌地图 谷歌办公套件 谷歌云认证培训服务 开放表格式依赖
  • R语言的微博数据处理

    用R语言处理微博数据 用到TM包 rJava包 slam包 自己还对李舰老师的Rwordseg进行了反编译 将最新的ansj弄了进去 首先来进行下微博的处理 我将每一个用户的微博放在一个文档中 文档名为用户id txt 首先导入需要用的包
  • C# Bitmap 与 Bytes数组,Bitmap与Image 控件的转换

    没事总结一下平时用到的几种图像相互转换方法 供大家参考 1 Bitmap 转byte 数组
  • Pandas ExcelWrite 简单的增改表格

    writer sheets 表格名字 writer pd ExcelWriter error report path engine xlsxwriter df pd DataFrame error info1 columns col df
  • rk3399调试ov2659(camera模块@dvp接口)--移植过程

    版权声明 本文为博主原创文章 转载请注明出处 https blog csdn net huang 165 article details 86130288 参考博客 RGB 与YUY格式简介 https blog csdn net u010
  • 远控博主远控博主

    Wh04m1001 SysmonEoP github com 关于这个博客 idiotc4t s blog
  • python 常用代码块

    1 计时 import time starttime time time print 计时 round time time starttime 0 秒 end r n 2 读文件 with open pi digits txt as f r
  • Unity事件触发

    一 EventSystem物体 当创建一个Canvas时会生成一个EventSystem物体 它包括以下3个组件 1 组件 Event System 被动触发事件系统 负责调度处理事件的输入 射线 发送 变量 First selected
  • 三分钟了解阿里云和腾讯云的DDoS防御策略

    三分钟了解阿里云和腾讯云的DDoS防御策略 DDoS攻击 即分布式拒绝服务 DDoS Distributed Denial of Service 攻击 是一种通过恶意流量导致受害者服务瘫痪的网络攻击行为 中小型网站站长在其父伍奇遭到DDoS
  • 华为发布HarmonyOS 3.0,向“万物互联”再迈一步

    整理 彭慧中 责编 屠敏 出品 CSDN ID CSDNnews HarmonyOS承载无数人操作系统的梦想再次向前迈进了一大步 7月27日晚 HarmonyOS 3 0系统正式发布 HarmonyOS是史上发展最快 也是覆盖升级机型最多的
  • Linux如何在屏幕上显示ASCII/中文字符

    能调API完成的事情非要自己折腾 这会严重影响效率 但这只是玩玩 下一篇文章我会介绍 setfont 命令的玩法 问题 如何在屏幕上显示一个字符 很简单 调用 printf 执行 echo 然而 我们知道 任何显示的操作 最终都是在显示器上
  • C++中fstream读写文件

    C 中fstream读写文件 fstream介绍 1 fstream是C 标准库中面向对象库的一个 用于操作流式文件 2 fstream本质上是一个class 提供file操作的一众方法 3 有核心课程中应用编程里文件操作的基础 fstre
  • Node写博客--添加博客分类功能(修改和删除)

    1 在layout html中加入一个 分类管理 ul class nav navbar nav li a href admin user 用户管理 a li li class dropdown a href class dropdown
  • 【Shell牛客刷题系列】SHELL20 打印只有一个数字的行:awk叫上正则表达式好兄弟来刷题~

    该系列是基于牛客Shell题库 针对具体题目进行查漏补缺 学习相应的命令 刷题链接 牛客题霸 Shell篇 该系列文章都放到专栏下 专栏链接为 专栏 Shell 欢迎关注专栏 本文知识预告 本文首先学习了正则表达式和awk命令的相关的用法