大家好,又见面了,我是你们的朋友全栈君。
这一篇,我们来学习一些重要的命令,在工作中也会经常用到。
一、简单正则
要注意的是,有些命令不支持正则模式,比如fs、find等,有些是支持正则的,比如grep、awk、sed等。正则的语法和js中的正则几乎没有区别,下面仅简单罗列下常用的正则:
元字符 | 作用 | 示例 |
---|---|---|
* | 前一个字符匹配 0 次或任意多次 | grep 1* reg.txt |
. | 匹配除换行符外的任意一个字符 | grep . reg.txt |
^ | 匹配行首。例如,^hello 会匹配以 hello 开头的行 | grep ^a reg.txt |
$ | 匹配行尾。例如,hello& 会匹配以 hello 结尾的行 | grep a$ reg.txt |
[] | 匹配中括号中指定的任意一个字符,而且只匹配一个字符。例如.[aoeiu]匹配任意一个元音字母, [0-9] 匹配任意一位数字,[a-z][0-9] 匹配由小写字母和一位数字构成的两位字符 | grep ab[bc]c reg.txt |
[^] | 匹配除中括号中的字符以外的任意一个字符。例如,[^0-9] 匹配任意一位非数字字符,[^a-z] 匹配任意一位非小写字母 | grep a[^fg]c reg.txt |
转义符,用于取消特殊符号的含义 | grep .$ reg.txt | |
{n} | 表示其前面的字符恰好出现 n 次。例如,[0-9]{4} 匹配4位数字,[1][3-8][0-9]{9} 匹配手机号码 | grep “a{1}” reg.txt |
(n,} | 表示其前面的字符出现不少于 n 次。例如,[0-9]{2,} 匹配两位及以上的数字 | grep “a{1,}” reg.txt |
{n,m} | 表示其前面的字符至少出现 n 次,最多出现 m 次。例如,[a-z]{6,8} 匹配 6〜8 位的小写字母 | grep “a{2,3}” reg.txt |
例子已经写在表格里了,大家可以自己去试一下。这里不多说。
二、cut命令
用来提取文本中的某一部分。
选项有:
- -b,以字节为单位进行分割。这些字节位置将忽略多字节字符边界,除非也指定了 -n 标志。
- -c,以字符为单位进行分割。
- -f,与-d一起使用,指定显示哪个区域。
- -d,自定义分隔符,默认为制表符。
如果不指定 File 参数,cut 命令将读取标准输入。必须指定 -b、-c 或 -f 标志之一。
cut最常用的就是-d和-f的配合使用:
或者:
然后,cut的作用可远不止如此,还有一些其他的用法。要注意灵活运用。
三、printf命令
printf 由 POSIX 标准所定义,因此使用 printf 的脚本比使用 echo 移植性好。printf 使用引用文本或空格分隔的参数,外面可以在 printf 中使用格式化字符串,还可以制定字符串的宽度、左右对齐方式等。默认 printf 不会像 echo 自动添加换行符,我们可以手动添加 n。
printf的语法是这样的:
- printf format–string [arguments…],
- format-string: 为格式控制字符串
- arguments: 为参数列表。
我们先来看个例子:
代码语言:javascript复制#!/bin/bash
printf "%-10s %-8s %-4sn" 姓名 性别 体重kg
printf "%-10s %-8s %-4.2fn" 郭靖 男 66.1234
printf "%-10s %-8s %-4.2fn" 杨过 男 48.6543
printf "%-10s %-8s %-4.2fn" 郭芙 女 47.9876
结果是:
1、%s %c %d %f 都是格式替代符,%s 输出一个字符串,%d 整型输出,%c 输出一个字符,%f 输出实数,以小数形式输出。
2、%-10s 指一个宽度为 10 个字符(– 表示左对齐,没有则表示右对齐),任何字符都会被显示在 10 个字符宽的字符内,如果不足则自动以空格填充,超过也会将内容全部显示出来。
3、%-4.2f 指格式化为小数,其中 .2 指保留2位小数。
我们再来看个例子:
代码语言:javascript复制#!/bin/bash
# format-string为双引号
printf "%d %sn" 1 "abc"
# 单引号与双引号效果一样
printf '%d %sn' 1 "abc"
# 没有引号也可以输出
printf %s abcdef
# 格式只指定了一个参数,但多出的参数仍然会按照该格式输出,format-string 被重用
printf %s abc def
printf "%sn" abc def
printf "%s %s %sn" a b c d e f g h i j
# 如果没有 arguments,那么 %s 用NULL代替,%d 用 0 代替
printf "%s and %d n"
结果如下:
另外,printf的转义序列如下:
序列 | 说明 |
---|---|
a | 警告字符,通常为ASCII的BEL字符 |
b | 后退 |
c | 抑制(不显示)输出结果中任何结尾的换行字符(只在%b格式指示符控制下的参数字符串中有效),而且,任何留在参数里的字符、任何接下来的参数以及任何留在格式字符串中的字符,都被忽略 |
f | 换页(formfeed) |
n | 换行 |
r | 回车(Carriage return) |
t | 水平制表符 |
v | 垂直制表符 |
\ | 一个字面上的反斜杠字符 |
ddd | 表示1到3位数八进制值的字符。仅在格式字符串中有效 |