西数超哥博客
运维经验教程分享

【原创】shell学习笔记第三天(shell相关基础补充)

周末了,打个酱油,把一些shell相关的再补充下。

1,命令搜寻顺序

  1. 以相对/绝对路径运行命令,例如『 /bin/ls 』或『 ./ls 』;
  2. 由 alias 找到该命令来运行;
  3. 由 bash 内建的命令来运行;
  4. 透过 $PATH 这个变量的顺序搜寻到的第一个命令来运行。
  5. 都找不着就不是个命令,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) 并不是管线命令的原因啊!</span>

[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 会导致内存不足删除失败。

 

转载请注明:西数超哥博客www.ysidc.top» 【原创】shell学习笔记第三天(shell相关基础补充)

https://www.ysidc.top 西数超哥博客,数据库,西数超哥,虚拟主机,域名注册,域名,云服务器,云主机,云建站,ysidc.top

赞(0)
声明:本站发布的内容(图片、视频和文字)以原创、转载和分享网络内容为主,若涉及侵权请及时告知,将会在第一时间删除。本站原创内容未经允许不得转载:西数超哥博客 » 【原创】shell学习笔记第三天(shell相关基础补充)