周末了,打个酱油,把一些shell相关的再补充下。
1,命令搜寻顺序
- 以相对/绝对路径运行命令,例如『 /bin/ls 』或『 ./ls 』;
- 由 alias 找到该命令来运行;
- 由 bash 内建的命令来运行;
- 透过 $PATH 这个变量的顺序搜寻到的第一个命令来运行。
- 都找不着就不是个命令,game over
2,读入环境配置文件的命令source
由于 /etc/profile 与 ~/.bash_profile 都是在取得 login shell 的时候才会读取的配置文件,所以, 如果你将自己的偏好配置写入上述的文件后,通常都是得注销再登陆后,该配置才会生效。那么,能不能直接读取配置文件而不注销登陆呢?直接使用source执行即可。比如修改了 ~/.bashrc (搞了一下别名alias命令),不需要注销,立即以 source ~/.bashrc 就可以将刚刚最新配置的内容读进来目前的环境中!
3,通配符与特殊符号(老熟人了!)
通配符:
符号 | 意义 |
* | 代表『 0 个到无穷多个』任意字符 |
? | 代表『一定有一个』任意字符 注意只匹配一个字符! |
[ ] | 同样代表『一定有一个在括号内』的字符(非任意字符)。例如 [abcd] 代表『一定有一个字符, 可能是 a, b, c, d 这四个任何一个』注意,只匹配一个! |
[ – ] | 若有减号在中括号内时,代表『在编码顺序内的所有字符』。例如 [0-9] 代表 0 到 9 之间的所有数字,因为数字的语系编码是连续的! |
[^ ] | 若中括号内的第一个字符为指数符号 (^) ,那表示『反向选择』,例如 [^abc] 代表 一定有一个字符,只要是非 a, b, c 的其他字符就接受的意思。 |
比如:
if [[ $LANG =~ [Uu][Tt][Ff]8 ]] #如果系统是utf8编码
then
echo “$1”
else #如果系统是gbk编码
echo “$1” | iconv -f utf-8 -t gbk
fi
特殊符号:
符号 | 内容 |
# | 批注符号:这个最常被使用在 script 当中,视为说明!在后的数据均不运行 |
\ | 跳脱符号:将『特殊字符或通配符』还原成一般字符 |
| | 管线 (pipe):分隔两个管线命令的界定; |
; | 连续命令下达分隔符:连续性命令的界定 (注意!与管线命令并不相同) |
~ | 用户的家目录 |
$ | 取用变量前导符:亦即是变量之前需要加的变量取代值 |
& | 工作控制 (job control):将命令变成背景下工作 |
! | 逻辑运算意义上的『非』 not 的意思! |
/ | 目录符号:路径分隔的符号 |
>, >> | 数据流重导向:输出导向,分别是『取代』与『累加』 |
<, << | 数据流重导向:输入导向 (这两个留待下节介绍) |
‘ ‘ | 单引号,不具有变量置换的功能 |
” “ | 具有变量置换的功能! |
` ` | 两个『 ` 』中间为可以先运行的命令,亦可使用 $( ) |
( ) | 在中间为子 shell 的起始与结束 |
{ } | 在中间为命令区块的组合! |
4,数量流相关-命令运行的判断依据 ; , &&, ||
;说明:命令与命令中间利用分号 (;) 来隔开,这样一来,分号前的命令运行完后就会立刻接着运行后面的命令了 。比如cd / ;ll 不考虑前后命令的有惯性。
&&于||:
命令下达情况 | 说明 |
cmd1 && cmd2 | 1. 若 cmd1 运行完毕且正确运行($?=0),则开始运行 cmd2。 2. 若 cmd1 运行完毕且为错误 ($?≠0),则 cmd2 不运行。 |
cmd1 || cmd2 | 1. 若 cmd1 运行完毕且正确运行($?=0),则 cmd2 不运行。 2. 若 cmd1 运行完毕且为错误 ($?≠0),则开始运行 cmd2。 |
注意回传值的问题:若前一个命令运行的结果为正确,在 Linux 底下会回传一个 $? = 0 的值。常用作判断语句使用。
5,管道命令(为什么有些命令是管道命令有些不是,和标准输出有关系,不清楚的话可以查下鸟哥的管道命令说明哟)
5.1,截取命令cut, grep 截图命令通常是针对一行一行来分析的, 并不是整篇信息分析。
cut目前用到的不是,可以查参数自己组合就可以了。 grep用户无处不在而且功能强大!这个要经常用的肯定大家都会了。不清楚的请再找资料加上平时多练习下,比 如之前我们联系netstat命令还有从日志查找参数或文件里边搜索木马关键字,这个都经常用的。
5.2 排序命令 sort uniq wc
这三个命令也是经常用的了,镜像借助于这几个命令排查问题,脚本中也没少用。
简单补充一点呗:
sort排序用法:
[root@www ~]# sort [-fbMnrtuk] [file or stdin] 选项与参数: -f :忽略大小写的差异,例如 A 与 a 视为编码相同; -b :忽略最前面的空格符部分; -M :以月份的名字来排序,例如 JAN, DEC 等等的排序方法; -n :使用『纯数字』进行排序 -r :反向排序; -u :就是 uniq ,相同的数据中,仅出现一行代表; -t :分隔符,默认是用 [tab] 键来分隔; -k :以那个区间 (field) 来进行排序的意思
uniq : 把重复的数据值列出一次并统计次数或只显示一次。
[root@www ~]# uniq [-ic] 该命令常结合sort用法进行使用,这个命令非常重要! 选项与参数: -i :忽略大小写字符的不同; -c :进行计数。在每列旁边显示该行重复出现的次数;这个参数非常重要! -u :仅显示出一次的行列 比如:cat access.log |awk '{print $1}' | sort | uniq -c | sort -nr | head -10
[root@www ~]# last | cut -d ‘ ‘ -f1 | sort | uniq -c
1
16 reboot
42 root
1 wtmp
wc命令,主要用来显示行数,常用参数为wc -l 比如netstat -tunpl | grep php-fpm | wc -l
[root@www ~]# wc [-lwm] 选项与参数: -l :仅列出行; -w :仅列出多少字(英文单字); -m :多少字符; |
6,xargs 参数代换命令。这个命令还是蛮重要的,可以掌握下,不吃亏。使用 xargs 的原因是, 很多命令其实并不支持管线命令,因此我们可以透过 xargs 来提供该命令引用 standard input 之用!
找出 /sbin 底下具有特殊权限的档名,并使用 ls -l 列出详细属性
[root@www ~]# find /sbin -perm +7000 | ls -l # 结果竟然仅有列出 root 所在目录下的文件!这不是我们要的! # 因为 ll (ls) 并不是管线命令的原因啊! [root@www ~]# find /sbin -perm +7000 | xargs ls -l -rwsr-xr-x 1 root root 70420 May 25 2008 /sbin/mount.nfs -rwsr-xr-x 1 root root 70424 May 25 2008 /sbin/mount.nfs4 -rwxr-sr-x 1 root root 5920 Jun 15 2008 /sbin/netreport
比如:ls | xargs rm -rf; xargs逐行传递删除文件,用于目录下文件数量比较多的情况,直接执行rm -rf 会导致内存不足删除失败。
转载请注明:21运维 » shell学习笔记第三天(shell相关基础补充)