网络、文本处理工具与 Shell 脚本
I/O 重定向与管道
重定向
(这不是C语言的内容吗,果然学到后面就会有相通的地方是吧!!)
$ echo "Hello Linux!" > output_file # 将输出写入到文件(覆盖原有内容)
$ cat output_file
Hello Linux!
$ echo "rewrite it" > output_file
$ cat output_file # 可以看到原来的 Hello Linux! 被覆盖了。
rewrite it
$ echo "append it" >> output_file # 将输出追加到文件(不会覆盖原有内容)
$ cat output_file
rewrite it
append it
管道
(好熟悉!!!好像之前和正则表达式一起学的)
例子:
$ ls / | grep bin # 筛选 ls / 输出中所有包含 bin 字符串的行
bin
sbin
网络下载
为何使用 wget 和 cURL(只用过wget,,,)
wget
curl
但 cURL 由于可自定义各种请求参数,所以在模拟 web 请求方面更擅长;wget 由于支持 FTP 协议和递归遍历,所以在下载文件方面更擅长。
文本处理
在进行文本处理时,我们有一些常见的需求:
- 获取文本的行数、字数
- 比较两段文本的不同之处
- 查看文本的开头几行和最后几行
- 在文本中查找字符串
- 在文本中替换字符串
下面介绍如何在 shell 中做到这些事情
文本统计:wc
文本比较:diff
文本开头与结尾:head & tail
示例:
$ head file # 显示 file 前 10 行
$ head -n 25 file # 显示 file 前 25 行
$ head -25 file # 显示 file 前 25 行
$ head -c 20 file # 显示 file 前 20 个字符
$ tail -10 file # 显示 file 最后 10 行
文本查找:grep
$ grep 'hello' file # 查找文件 file 中包含 hello 的行
$ ls | grep 'file' # 查找当前目录下文件名包含 file 的文件
$ grep -i 'Systemd' file # 查找文件 file 中包含 Systemd 的行(忽略大小写)
$ grep -R 'hello' . # 递归查找当前目录下内容包含 hello 的文件
文本替换:sed
$ sed 's/hello/world/g' file # 将文件 file 中的 hello 全局(global)替换为 world 后输出
$ sed 's/hello/world/' file # 将文件 file 的每一行第一个出现的 hello 替换为 world 后输出
$ echo 'helloworld' | sed 's/hello/world/g' # 管道也是可以的
$ sed -i 's/hello/world/g' file # -i 参数会直接写入文件,操作前记得备份哦!
$ sed -i.bak 's/hello/world/g' file # 当然,也可以让 sed 帮你备份到 file.bak
Shell 脚本
bash
使用 .
命令执行脚本会在当前 shell 中执行脚本,而不是新建一个 shell 去执行脚本。这意味着,脚本中的变量赋值、函数定义以及切换目录(cd
命令)等变化都会在当前 shell 中生效。
shell 变量
用户自定义变量
变量定义:name=串
,其中 =
两边不允许有空格。如果字串中含空格,就要用双引号括起。在引用时,使用 $name
或 ${name}
,后者花括号是为了帮助解释器识别变量边界。
已定义的变量可以通过 unset name
来删除
tips:
关于环境变量点击链接
位置变量
(预定义变量中的一类),位置参数变量可以向Shell脚本中传递各个位置的参数。(用来给脚本传参数)
特殊变量
变量输入与输出
输入:read
$ name=""
$ read -p "Enter your name: " name # 输出提示,然后从输入读取一个值,存储到 $name 中
Enter your name: linux
$ echo $name
linux
输出:
echo
printf
算术运算
条件表达式(数值比较(大于小于)、文件状态(是否可读))
流程控制(if case等等)
函数
shell脚本调试