楔子
大家好,我是张桃狮。
最近我在力扣做题的时候,遇到一些Linux相关的题目。
我上一次使用Linux,还是二十年前刚买电脑的时候。
当时我给自己的电脑安装了Ubuntu系统——一个Linux的发行版。
使用Ubuntu的时候,我每天都在折腾显卡驱动,我记得安装一些软件还需要自己手动编译源码。
后来我还是用回了Windows。
现在如果我把家里的电脑安装Linux系统,瓜瓜会打死我的。
还好我发现了WSL这个好东东。
WSL(Windows Subsystem for Linux)是微软推出的Windows 内置兼容层,能让你在 Windows 系统上原生运行 Linux 发行版(如 Ubuntu、Debian),无需虚拟机或双系统。
它的核心优势是Windows 与 Linux 无缝互通,可以直接访问 Windows 磁盘文件、共享网络端口。
可以看出,WSL非常适合小白在Windows 上学习Linux。
安装之前,需要先检查CPU硬件是否支持。
按Ctrl+Shift+Esc,打开任务管理器-性能-CPU,看右下角的虚拟化是否已启用。
如果是关闭状态,需要重启电脑进BIOS开启。
我家的电脑是AMD的CPU,BIOS虚拟化开启步骤如下。
Frequency Settings-Advanced CPU Core Settings-SVM Mode(安全虚拟机模式),设为Enabled。
最后记得保存退出。
Intel的CPU开启步骤可能不一样,大家可以自己问下AI。
用管理员权限打开cmd,输入如下命令回车。
wsl --install
如果有报错,就把报错信息发给AI。
我用的豆包,豆包给出的一些操作建议,说实话我都不知道是干啥的,心里捏了一把汗。
还好最后把所有遇到的问题都解决了。
安装过程中可能需要重新启动电脑。
我在最后一步卡了很久,每次下载Ubuntu都不成功。
最后手动下载了Ubuntu,用的网友提供的下载地址。
下载地址如下。
https://aka.ms/wslubuntu2204
如果觉得下载速度太慢,可以用迅雷。
下载下来后,双击打开就可以自动安装Ubuntu了。
第一次打开需要设置用户名和密码。
一定要记好密码,后续使用sudo命令的时候还要输入。
安装好以后,我在开始菜单看到了Ubuntu的图标。
也可以在搜索里搜索WSL直接打开Linux终端。
打开后是一个黑乎乎的终端窗口,我输入ls,相当于cmd下面的dir。
看着终端窗口中显示出的文件列表,我感觉WSL终于安装成功了。
我想整点比较酷的东西庆祝一下。
输入sudo apt install cmatrix -y
装好以后输入cmatrix,可以看到黑客帝国字符雨动画。
在我的电脑上,如果是在Windows环境复制的文本,在Linux窗口粘贴需要单击鼠标右键。
打开Windows C盘需要输入cd /mnt/c。
打开Windows桌面需要输入cd /mnt/c/Users/你的Windows用户名/Desktop。
最后说一下为什么要学习Linux?
现在Linux已经是云服务器的事实标准了,我一直想有一台自己的云服务器。
闲话讲完,咱们开始刷Linux相关的力扣题目。
193. 有效电话号码
给定一个包含电话号码列表(一行一个电话号码)的文本文件 file.txt,写一个单行 bash 脚本输出所有有效的电话号码。
你可以假设一个有效的电话号码必须满足以下两种格式: (xxx) xxx-xxxx 或 xxx-xxx-xxxx。(x 表示一个数字)
你也可以假设每行前后没有多余的空格字符。
示例:
假设 file.txt 内容如下:
987-123-4567
123 456 7890
(123) 456-7890
你的脚本应当输出下列有效的电话号码:
987-123-4567
(123) 456-7890
我的思路
Bash = Bourne Again Shell,是 Unix/Linux 系统中最主流的 命令行解释器 (Shell)。
之前我没有接触过Bash脚本,不过正则表达式还是会的。
先写出匹配第一种电话号码格式的正则表达式。
^\d{3}-\d{3}-\d{4}$
在写匹配第二种电话号码格式的正则表达式。
注意这里有一个空格,我刚开始没注意,被小坑一把。
^\(\d{3}\) \d{3}-\d{4}$
然后将两个正则表达式用|连起来。
^\d{3}-\d{3}-\d{4}$|^\(\d{3}\) \d{3}-\d{4}$
如果用影刀来做这道题,就简单了。
先把file.txt的内容读取出来,用换行符将电话号码拆分为列表。
列表循环,用上面的正则表达式提取有效的电话号码并输出。
光说不练假把式,影刀应用截图如下。
提交运行通过。
可是bash脚本怎么写,我只能看官方题解了。
结果这道题没有官方题解。
我将网友高赞题解(来自會飛的鳥)中的正则表达式做了替换,也提交通过了。
grep -P '^\d{3}-\d{3}-\d{4}$|^\(\d{3}\) \d{3}-\d{4}$' file.txt
awk '/^[0-9]{3}-[0-9]{3}-[0-9]{4}$|^\([0-9]{3}\) [0-9]{3}-[0-9]{4}$/' file.txt
grep 是 Linux/Unix/WSL 中最最常用的命令行工具,没有之一!
核心作用:在「文本 / 文件 / 命令输出结果」中,按「关键字 / 正则表达式」搜索、筛选、提取内容。
grep参数-P :启用「Perl 兼容正则表达式」——让 grep 支持 非贪婪匹配 .*?、\d(匹配数字)、\w(匹配字母) 等完整正则语法。
awk 是 Linux/Unix/WSL 中最核心的「文本处理工具 + 编程语言」,它不是一个简单的命令,而是一套专门用来处理「结构化文本」的完整工具。
awk 只支持POSIX标准正则,POSIX标准正则不支持\d(简写),只支持 [0-9]。
所以需要将正则表达式中\d替换为[0-9],才能提交成功。
grep:擅长「过滤行」 → 按条件筛选出符合要求的整行内容。
awk:擅长「处理列」 → 按列提取、分割、计算、格式化输出内容。
Ubuntu 所有版本(包括桌面版、服务器版),都默认预装了 grep 和 awk 工具,无需手动安装,打开终端直接输入命令就能用,这两个是 Linux/Ubuntu 的核心系统工具,属于必装基础组件。
所以想要练习使用grep 和 awk,只要打开WSL就好了。
最后说下Bash(Bourne Again Shell)名字的由来。
1979 年,Stephen Bourne 在贝尔实验室开发出了 Unix 系统的第一个主流 Shell → Bourne Shell,它的可执行文件路径是 /bin/sh,是 Unix 的初代标准 Shell
1989 年,为了弥补 Bourne Shell 的功能短板(语法简陋、无补全、无历史命令等),Brian Fox 基于 Bourne Shell 的语法规范,开发出了增强版,命名为 Bourne Again Shell
Bourne Again 发音和拼写 ≈ Born Again(英文短语,意思是「重生、再生、浴火重生」)
翻译过来的双关就是:Bash = 伯恩的 Shell 重生了。
我是个编程爱好者,小白级别的,如果你跟我一样希望通过力扣刷题,学习各种奇妙的算法,可以关注我,大家一起学习。