简单的写了一些Linux的课外拓展学习的相关知识和问题。
一、命令的参数
编写一个小程序,可以显示命令的选项和参数
点击查看代码
1 |
|
效果:
二、关于控制printf输出的颜色
编写程序hello.c,编译和运行程序,得到类似以下结果:
可以通过
1 | \033[ |
来控制printf输出的颜色,格式为:
1 | printf("\033[字背景颜色;字体颜色m 字符串 \033[0m" ); |
注意,一定要在printf最后使用
1 | \033[0m |
来消除前面的作用,否则前面的设置对后面的printf都有效果。
ANSI控制码 | 效果 |
---|---|
\033[0m | 关闭所有属性 |
\033[1m | 设置高亮度 |
\033[4m | 下划线 |
\033[5m | 闪烁 |
\033[7m | 反显 |
\033[8m | 消隐 |
\033[30m —\033[37m | 设置前景色 |
\033[40m—\033[47m | 设置背景色 |
\033[nA | 光标上移n行 |
\03[nB | 光标下移n行 |
\033[nC | 光标右移n行 |
\033[nD | 光标左移n行 |
字背景颜色范围: 40–49
字颜色范围: 30—39
字背景颜色代号 | 字背景颜色 | 字颜色代号 | 字颜色 |
---|---|---|---|
40 | 黑 | 30 | 黑 |
41 | 红 | 31 | 红 |
42 | 绿 | 32 | 绿 |
43 | 黄 | 33 | 黄 |
44 | 蓝 | 34 | 蓝 |
45 | 紫 | 35 | 紫 |
46 | 青 | 36 | 青 |
47 | 白 | 37 | 白 |
小程序具体代码:
点击查看代码
1 |
|
在这里\e和\033是一个意思,e的八进制代码就是033,这两个print其实效果是一样的,前面那个printf中多个连续的“xxx”字符串会被自动整合为一个字符串,其实最终执行的就是第二个printf。
效果:
三、关于Linux中bash的变量、替换和元字符
要求只列出所有bash进程的状态,使用命令
1 | ps -ef | grep bash |
但grep进程自身也被输出了:
使用以下的命令:
1 | ps -ef | grep [b]ash |
可以
上面这5个命令的核心目的其实是改变grep在
1
ps -ef
命令中的显示形式,例如这一个,我们使用三通(tee)命令将在grep命令过滤之前的输出定向到一个文件中。
先将原命令试一下:
1
2ps -ef | tee 1.txt | grep bash
cat 1.txt与1这个命令进行一下对比:
1
2ps -ef | tee 1.txt | grep [b]ash
cat 1.txt我们可以很明显的看到,grep命令确实改变了,因为正则表达式
1
[b]ash
是可以匹配bash的,但是却不能匹配[b]ash,因此第一行的-bash这一行被取了出来,而最后grep这一行,由于不匹配[b]ash,就取不出来了,刚好实现了我们只列出所有bash进程的状态的目的,下面的几个命令大同小异。
不可以
1
2ps -ef | tee 1.txt | grep \\bash
cat 1.txt首先,\是Shell的元字符,先被\转义为真正的单个字符\,因此传给grep的正则表达式其实是\bash,而在正则表达式中,\b有特殊含义,是单词边界,因此就连bash和\bash全部都没有匹配到。
可以
1
2ps -ef | tee 1.txt | grep b\\ash
cat 1.txt和2一样,传给grep的正则表达式为b\ash,在正则表达式中\a是没有意义的,因此\被丢弃,正则表达式其实就是bash,所以第一行的-bash这一行被取了出来,而最后grep这一行,由于不匹配b\ash,就取不出来了。
不可以
1
2ps -ef | tee 1.txt | grep b\ash
cat 1.txt首先,\a先经过Shell的替换,因\a是没有特殊含义的,因此\被直接丢掉,传给grep的正则表达式为bash,这就和使用这个命令是一样的:
1
ps -ef | grep bash
显然是不能实现目的。
不可以
1
2ps -ef | tee 1.txt | grep ba\\sh
cat 1.txt这个和2基本是一样的,和3唯一的区别就是,第3个中\a对正则表达式而言是没有特殊含义的,但是\s对正则表达式而言是有特殊含义的,\s代表空白字符(可能是空格、制表符、其他空白),也就是说,grep匹配到的应该是类似于:
1
ba h
这种的字符串,显然-bash和ba\sh都不符合,因此就什么都没取到。