炼数成金--shell实例 3

来源:互联网 发布:python tcp服务器端 编辑:程序博客网 时间:2024/04/29 19:19

特殊字符:

:  true

$   求变量

单引号   忽略其中的所有特殊字符,都按字面值

双引号   除了$ \  ` 以外,其他特殊字符按字面值

`       `cat` == $(cat)    `  ` == $()  执行命令

()   命令分组,内部的命令会在一个子shell中运行

(())     整数的扩展运算   a=10; ((b=a++)); echo "a = $a b=$b"

{}        a.{1..5} == a.1 a.2 a.3 a.4 a.5  列表   {a,b,c} == a b c ,a={0..5}   echo $a    0 1 2 3 4 5

[          与test命令一样

[[ ]]   bask专有的高级 test

 

注意: 在 ((  ))    [  ]  [[ ]]  两边要有空格

             转义字符\ 可以让上面的特殊字符 失效

 

替代字符:

~   home 目录

~+   $PWD

~-     $OLDPWD

- (--)

 

匹配字符:

*       匹配0到任意多个字符(文件名)

?     匹配一个任意字符(文件名)

 

shell 扩展:按照1-9的先后顺序

1. 花括号 : {1...15}

2.代字符:  ~

3.参量扩展: ${var}

4.命令替换       $(date)

5.算术扩展:  $(( 1+2 ))

6.过程替换:  echo  <(:)  (<与小括号之间没有空格,将小括号里面命令执行,将<的输出为文件描述符,并且把文件描述符对应的文件替换到命令产生的内容

                                           eg: echo <(:)  --->/proc/fd/63           echo <(echo "abc")   --->abc

7.词分离    默认是空格

8. 路径名扩展   *  ?

9. 去引号

 

子shell

1. Linux/unix 系统通过fork系统调用产生新进程

2. 子进程和父进程除了PID以外完全一致,比如打开的文件,权限(UID,GID) ,当前工作路径都一样

3. 进程自己通过判断自己的PID来决定后面运行的方式

4. 子shell是shell的子进程,子shell会继承环境变量(一层层继承),清空普通变量

5.在shell上运行的进程也可以读到环境变量并因此改变其行为 

 

UID为0的进程,可以把UID降级成任何非零值

UID不等于0的进程,只可以通过suid来提升UID为0

-rwsr-xr-x         root root   /usr/bin/sudo   (s suid,说明执行这个文件的权限跟这个文件的所有者owner有同样的权限)

 -rwsr-xr-x                         /bin/su

 -rwsr-xr-x                           /usr/bin/passwd

-rw-r-----           root shadow             /etc/shadow

 

查看进程的输入输出,可以从 /proc/uid/fd 来看

 

环境变量:在shell之间,shell运行的命令之间继承  通过env(列出当前环境变量)或者export命令查看,unset可以删除,export来定义

1.Linux的变量种类
  按变量的生存周期来划分,Linux变量可分为两类:
  1.1 永久的:需要修改配置文件,变量永久生效。
  1.2 临时的:使用export命令声明即可,变量在关闭shell时失效。
  2.设置变量的三种方法
  2.1 在/etc/profile文件中添加变量【对所有用户生效(永久的)】
  用VI在文件/etc/profile文件中增加变量,该变量将会对Linux下所有用户有效,并且是“永久的”。
  例如:编辑/etc/profile文件,添加CLASSPATH变量
  # vi /etc/profile
  export CLASSPATH=./JAVA_HOME/lib;$JAVA_HOME/jre/lib
  注:修改文件后要想马上生效还要运行# source /etc/profile不然只能在下次重进此用户时生效。
  2.2 在用户目录下的.bash_profile文件中增加变量【对单一用户生效(永久的)】
  用VI在用户目录下的.bash_profile文件中增加变量,改变量仅会对当前用户有效,并且是“永久的”。
  例如:编辑guok用户目录(/home/guok)下的.bash_profile
  $ vi /home/guok/.bash.profile
  添加如下内容:
  export CLASSPATH=./JAVA_HOME/lib;$JAVA_HOME/jre/lib
  注:修改文件后要想马上生效还要运行$ source /home/guok/.bash_profile不然只能在下次重进此用户时生效。
  2.3 直接运行export命令定义变量【只对当前shell(BASH)有效(临时的)】
  在shell的命令行下直接使用[export 变量名=变量值] 定义变量,该变量只在当前的shell(BASH)或其子shell(BASH)下是有效的,shell关闭了,变量也就失效了,再打开新shell时就没有这个变量,需要使用的话还需要重新定义。

PATH    指定命令的搜索路径,冒号隔开

HOME  用户主目录

HISTSIZE   保存历史命令记录的条数

LOGNAME   当前用户登录名

HOSTNAME  主机名称,许多应用程序需要用到主机名都是可以从此变量提取

SHELL  当前用户用的哪种shell

LANG/LANGUAGE  和语言相关,使用多种语言的用户可以修改此变量(或者当出现乱码时)

MAIL  当前用户的邮件存放目录

PS1   命令提示符,默认对于root用户#结尾,普通用户是$结尾, 可以修改的

PS2  附属提示符 ,默认是>

$IFS  shell输入分隔符,通常是空格,tab,换行符

 

变量:

等号 = 赋值, 两边没有空格  abc=1

定义不用$,   引用$或者 ${ }

可以使用declare或者typeset来指定格式

               -r readonly

               -i   数字

               -x   环境变量    declare -x aaa 定义了一个环境变量

               -f   函数

 

特殊内置变量:

$#  参数个数

$0  shell脚本名字

$@ 类似$*, 但是不用分隔符

$*  所有参数,用IFS中第一个字符分隔符隔开

$1,$2.......第1个,第2个参数

$?  前条命令的退出状态,0 true, 1 false

$$  本进程PID

$RANDOM    0~32767 的随机数

$?

$*

 

 

基本命令:

whereis:  查找命令所在的命令

pstree  -- 查看进程树    pstree -ac            pstree -pac    --显示PID

file     --查看文件在文件系统上的文件类型,普通文件类型,看显示的投内容来看具体类型,可执行文件

od -c xxx 将文件或者变量常量的内容 以二进制显示出来  类似有hexdump 命令

strings  把文件中的字符串抓出来   strings ls   (它的作用就是可以从二进制文件中提取出字符串,当编译成二进制文件时,想看看这个可执行文件某些文件,但是源码删了,这时可以使用strings  exe.file

strace  可以查看命令或者文件的调用路径。。。所以当某个命令出错的时候,可以使用这个命令

dd  ---copy..     dd if=/dev/zero   of=file     block=1024   count=4000  -----产生一个文件,文件内容都是0

                         dd if=/dev/sda   of=file1     block=512     count=1    ----使用file  file1查看file的类型为启动扇区,这512字节是文件系统的启动扇区部分

xargs  将标准输出的每一行作为后面命令的参数     ls |xargs du -sh

locate

 

find  ---对文件系统进行遍历,找到匹配的文件,并对文件进行操作

find  目录路径   匹配条件   执行动作

sudo find / -path /proc -prune  -o  -mmin -5  -print   找到最近5分钟更改的文件,找到proc文件系统则去掉,否则满足条件的打印出来。。

sudo find /  -path /proc -prune -o -exec file {} \;

 ++++++++++++++++++++++++++++++++++++++++++++++++

补充:

1. comm 命令: 文件对比命令,选择或拒绝两个已经排序文件的公共行

comm [-123] [--help] [--version][file1][file2]

-1 只显示第2个文件里面的行,   两个文件的共同行  (2列)

-2 只显示第1个文件里面的行,   两个文件的共同行  (2列)

-3 只显示第1个文件里面的,只显示第2个文件里面的  (2列)

  comm命令比较两个已排序文件每行数据的差异,并将其结果显示出来,如果没有指定任何参数,comm命令读取这两个文件,然后生成三列输出:1>仅在file1中出现的行2>仅在file2中出现的行3>在两个文件中都存在的行。
  如果为文件名之一指定 -(减号),则 comm 命令会从标准输入设备读取数据。


 2. uptime 显示系统负载

     以下显示输入uptime的信息:
04:03:58 up 10 days, 13:19, 1 user, load average: 0.54, 0.40, 0.20

1.当前时间 04:03:58
2.系统已运行的时间 10 days, 13:19
3.但前在线用户 1 user
4.平均负载:0.54, 0.40, 0.20
最近1分钟、5分钟、15分钟系统的负载
何为系统负载呢?
系统平均负载被定义为在特定时间间隔内运行队列中的平均进程树。如果一个进程满足以下条件则其就会位于运行队列中: 
- 它没有在等待I/O操作的结果 
- 它没有主动进入等待状态(也就是没有调用'wait') 
- 没有被停止(例如:等待终止)
一般来说,每个CPU内核当前活动进程数不大于3,则系统运行表现良好!当然这里说的是每个cpu内核,也就是如果你的主机是四核cpu的话,那么只要uptime最后输出的一串字符数值小于12即表示系统负载不是很严重.
当然如果达到20,那就表示当前系统负载非常严重,估计打开执行web脚本非常缓慢.
这里建议大家可以使用php探针来实现!这个可以检测空间商提供的linux主机负载情况!

3.关于/proc/uptime
/proc/uptime文件里包含两个数字,如:
[root@localhost ~]# cat /proc/uptime
1232468.44 1111331.67
第一个数值代表系统总的启动时间,第二个数值则代表系统空闲的时间,都是用秒来表示的。如果系统里第二个数字比第一个数字还要大,则说明你的cpu是多核的,cpu0上闲了一秒, cpu1上闲了两秒,加起就是三秒。。


4.bash命令解释套装程序包含了一些内部命令。内部命令在目录列表时是看不见的,它们由Shell本身提供。常用的内部命令有:echo, eval, exec, export, readonly, read, shift, wait和点(.)。下面简单介绍其命令格式和功能。
1.echo
命令格式:echo arg
功能:在屏幕上显示出由arg指定的字串。
2.eval
命令格式:eval args
功能:当Shell程序执行到eval语句时,Shell读入参数args,并将它们组合成一个新的命令,然后执行。
3.exec
命令格式:exec命令参数
功能:当Shell执行到exec语句时,不会去创建新的子进程,而是转去执行指定的命令,当指定的命令执行完时,该进程(也就是最初的Shell)就终止了,所以Shell程序中exec后面的语句将不再被执行。
4.export
命令格式:export变量名或:export变量名=变量值
功能:Shell可以用export把它的变量向下带入子Shell,从而让子进程继承父进程中的环境变量。但子Shell不能用export把它的变量向上带入父Shell。
注意:不带任何变量名的export语句将显示出当前所有的export变量。
5.readonly
命令格式:readonly变量名
功能:将一个用户定义的Shell变量标识为不可变。不带任何参数的readonly命令将显示出所有只读的Shell变量。
6.read
命令格式:read变量名表
功能:从标准输入设备读入一行,分解成若干字,赋值给Shell程序内部定义的变量。
7.shift语句
功能:shift语句按如下方式重新命名所有的位置参数变量,即$2成为$1,$3成为$2…在程序中每使用一次shift语句,都使所有的位置参数依次向左移动一个位置,并使位置参数$#减1,直到减到0为止。
8.wait
功能:使Shell等待在后台启动的所有子进程结束。wait的返回值总是真。
9.exit
功能:退出Shell程序。在exit之后可有选择地指定一个数位作为返回状态。
10.“.”(点)
命令格式:. Shell程序文件名
功能:使Shell读入指定的Shell程序文件并依次执行文件中的所有语句

5.使用crontab时要特别注意环境变量,我们手动执行的shell ,和系统自动调度的crontab的环境变量是不一样的,本人就吃过这个的亏,注意一下几点1、需要在crontab中指定所有环境变量
2、文件路径写绝对路径肯定不会错
3、要及时清理日志邮件

6.在类Unix系统中,/dev/null,或称空设备,是一个特殊的设备文件,它丢弃一切写入其中的数据(但报告写入操作成功),读取它则会立即得到一个EOF.
在类UNIX 操作系统中, /dev/zero 是一个特殊的文件,当你读它的时候,它会提供无限的空字符(NULL, ASCII NUL, 0x00)。其中的一个典型用法是用它提供的字符流来覆盖信息,另一个常见用法是产生一个特定大小的空白文件。
具体参考:http://zh.wikipedia.org/zh//dev/zero
http://zh.wikipedia.org/zh//dev/nul

7. linux格式化分区报错:Could not stat  --- No such file or directory 

   安装操作系统的时候,有一部分空间没有使用,在系统安装后,准备重新分区并格式化,在挂到/u01 下,来安装Oracle的。

   比如fdisk -l 查看已经分了3个区,但是空间没有完全占有,所以fdisk /dev/hda  , n ,4, 再建一个新的分区。

   使用fdisk -l 查看分区已经建好,但是使用mkfs -t ext4 /dev/hda4时,出错。。

   解决方法:执行下partprobe 命令
   partprobe包含在parted的rpm软件包中。partprobe可以修改kernel中分区表,使kernel重新读取分区表。 因此,使用该命令就可以创建分区并且在不重新启动机器的情况下系统能够识别这些分区。

   rpm -q parted

   partprobe

   然后再格式化就好了。

   

+++++++++++++++++++++++++++++++++++++++++++++

作业:

每天定时检查某个目录,记录文件的大小,修改时间,名字等熟悉,然后将增加的文件,删除的文件,修改的文件发送报告

用到的命:

find  diff   uniq 去重,uniq -f 8 忽略前8个字段,只比较后面的字段 , -u,保留非重复的行,

cut -c3- 截取c字符,从第3个开始到最后。。。(只取某几个字段),去掉某个几个字段。。。。

grep -w z精确匹配

grep -v 保留未匹配的行

sort -t "~" -k 9  以什么分割,以哪个字段排序

echo -e “aaa\n"  -e 开启转义模式

echo -n "abc"  去掉第一行默认的空行

cat file |while read line

do

    echo $line|awk 'BEGIN {OFS="~"} {print $1 OFS $NF OFS $0}  ---$1第一个字段,$NF,最后一个字段 , $0,整个一行

done

0 0
原创粉丝点击