Linux Shell介绍

写于2014年冬

简述

  • Shell是系统的用户界面,提供了用户与内核进行交互操作的一种接口。它接收用户输入的命令并把它送入内核去执行。
  • 实际上Shell是一个命令解释器,它解释由用户输入的命令并且把它们送到内核。不仅如此,Shell有自己的编程语言用于对命令的编辑,它允许用户编写由shell命令组成的程序。Shell编程语言具有普通编程语言的很多特点,比如它也有循环结构和分支控制结构等,用这种编程语言编写的Shell程序与其他应用程序具有同样的效果。
  • 同Linux本身一样,Shell也有多种不同的版本。主要有下列版本的Shell
    • Bourne Shell:Bourne shell 是UNIX 最初使用的shell,并且在每种UNIX 上都可以使用。Bourne
      shell 在shell 编程方面相当优秀,但在处理与用户的交互方面做得不如其他几种shell。
    • BASH:它是Bourne shell 的扩展,简称bash 。与Bourne shell 完全向后兼容,并且在Bourne shell
      的基础上增加增强了很多特性,它还包含了很多C shell 和Kornshell 中的优点,有灵活和强大的编程接口同时又有很友好的用户界面。
    • C Shell: C shell 是一种比Bourne shell 更适于编程的shell, 它的语法与C 语言很相似。Linux为喜欢使用C shell 的人提供了Tcsh。 Tcsh 是C shell 的一个扩展版本。Tcsh包括命令行编辑可编程单词补全、拼写校正历史命令替换、作业控制和类似C语言的语法。它不仅和Bash shell是提示符兼容而且还提供比Bashshell 更多的提示符参数。
    • Korn shell 集合了C shell 和Bourne shell 的优点并且和Bourne shell 完全兼容Linux 系统提供了pdksh (ksh 的扩展),它支持任务控制,可以在命令行上挂起、后台执行、唤醒或终止程序
    • Z Shell:The last shell you’ll ever need! Z是最后一个字母,也就是终极Shell。它集成了bash、ksh的重要特性,同时又增加了自己独有的特性。

变量与表达式

  • $# : 保存程序命令行参数的数目
  • $? : 保存前一个命令的返回码
  • $0 : 保存程序名
  • :" 1 $2…”)的形式保存所有输入的命令行参数
  • @:" 1”“$2”…)的形式保存所有输入的命令行参数
  • -r file : 当file是一个可读文件时,返回True
  • -w file : 当file是一个可写文件时,返回True
  • -x file : 当file是一个可执行文件时,返回True
  • -e file : 当file存在时,返回True
  • -o file : 当file文件的所有者是当前用户时,返回True
  • -z file : 当file长度为0时,返回True
  • -f file : 当file是一个普通文件时,返回True
  • -d file : 当file是一个目录时,返回True
  • Exp1 || exp2 : 当exp1和exp2的值至少一个为True时,返回True
  • Exp1 && exp2 : 当exp1和exp2的值同为True时,返回True
  • ! exp : 当exp的值为False时,返回True

正则表达式

  • 操作符 用途
    • .(句号) 匹配任意单个字符。
    • ^(脱字号) 匹配出现在行首或字符串开始位置的空字符串。
    • $(美元符号) 匹配出现在行末的空字符串。
    • A 匹配大写字母 A。
    • a 匹配小写字母 a。
    • \d 匹配任意一位数字。
    • \D 匹配任意单个非数字字符。
    • \w 匹配任意单个字母数字字符,同义词是 [:alnum:]。
    • [A-E] 匹配任意大写的 A、B、C、D 或 E。
    • [^A-E] 匹配除 A、B、C、D 和 E 之外的任意字符。
    • X? 匹配出现零次或一次的大写字母 X。
    • X* 匹配零个或任意个大写 X。
    • X+ 匹配一个或多个字母 X。
    • X{n} 精确匹配 n 个字母 X。
    • X{n,m} 匹配最少 n 个并且不超过 m 个字母 X。如果省略 m,表达式将尝试匹配最少 n 个 X。
    • (abc|def)+ 匹配一连串的(最少一个) abc 或 def;abc 和 def 将匹配。

find 和 xargs

  • find是在系统中查找具有某一特征的文件 (例如文件权限、文件属主、文件长度、文件类型等等 )
  • 选项
    • -name 按照文件名查找文件。
    • -perm 按照文件权限来查找文件。
    • -prune 使用这一选项可以使 find命令不在当前指定的目录中查找,如果同时使用了 -depth选项,那么prune选项将被find命令忽略。
    • -user 按照文件属主来查找文件。
    • -group 按照文件所属的组来查找文件。
    • -mtime -n +n 按照文件的更改时间来查找文件, - n表示文件更改时间距现在 n天以内, + n表示文件更改时间距现在 n天以前。
    • -newer file1 ! file2 查找更改时间比文件 file1 新但比文件 file2旧的文件。
    • -depth 在查找文件时,首先查找当前目录中的文件,然后再在其子目录中查找。
  • xargs
    • 在使用 find命令的-exec选项处理匹配到的文件时,find命令将所有匹配到的文件一起传递给exec执行。但有些系统对能够传递给exec的命令长度有限制,这样在find命令运行几分钟之后,就会出现溢出错误。错误信息通常是“参数列太长”或“参数列溢出”。这就是xargs命令的用处所在,特别是与find命令一起使用。
    • 选项
      • -0 当sdtin含有特殊字元时候,将其当成一般字符,想/’空格等
      • -p 操作具有可交互性,每次执行comand都交互式提示用户选择
      • -I xargs的每项名称,一般是一行一行赋值给{},可以用{}代替。-I 必须指定替换字符 -i 是否指定替换字符-可选
      • -d delim 分隔符,argument的分隔符是空格
      • -r 无参数时,停止 xargs
  • 示例
    • find / -type f -print | xargs grep "device“
    • find ./ -name "*.log" | xargs -i cp {} ./a/

grep

  • grep(全局正则表达式版本)允许对文本文件进行模式查找。如果找到匹配模式, grep打印包含模式的所有行。
    grep支持基本正则表达式,也支持其扩展集。 grep [选项] 基本正则表达式 [文件]
  • 常用的 grep选项有:
    • -c 只输出匹配行的计数。
    • -i 不区分大小写(只适用于单字符)。
    • -h 查询多文件时不显示文件名。
    • -l 查询多文件时只输出包含匹配字符的文件名。
    • -n 显示匹配行及行号。
    • -s 不显示不存在或无匹配文本的错误信息。
    • -v 显示不包含匹配文本的所有行。
    • -w 完整匹配
  • 示例
    • grep 'Time' load_ml.log
    • grep -c 'Time' load_ml.log
    • grep -v 'Time' load_ml.log
    • grep '2014-10-[1-8]' load_ml.log
    • grep '^[^2014]' load_ml.log
    • grep 'sql\{2,\}' load_ml.log
    • grep '^$' load_ml.log
    • ls -l | grep '^d‘
    • ps -ef | grep lock

sed

  • sed是一个非交互性文本流编辑器。
  • sed [ 选项] sed命令 输入文件。
  • 选项
    • n 不打印; sed不写编辑行到标准输出,缺省为打印所有行
    • c 下一命令是编辑命令。使用多项编辑时加入此选项
    • f 如果正在调用 sed脚本文件,使用此选项
    • i 编辑当前文件
  • 使用 sed在文件中定位文本的方式
    • x x为一行号,如 1
    • x , y 表示行号范围从 x到y,如 2, 5表示从第 2行到第 5行
    • / pattern / 查询包含模式的行。例如 / d i s k /或/[a-z]/
    • / pattern / pattern / 查询包含两个模式的行。例如 / d i s k / d i s k s /
    • pattern / , x 在给定行号上查询包含模式的行。如 / r i b b o n / , 3
    • x , / pattern / 通过行号和模式查询匹配行。 3 . / v d u /
    • x , y ! 查询不包含指定行号 x和y的行。 1 , 2 !
  • sed常用编辑命令
    • p 打印匹配行
    • d 删除定位行
    • s 使用替换模式替换相应模式
  • 示例
    • sed -n '1'p load_ml.log
    • sed -n '/Time/'p load_ml.log
    • sed -i 's/424.58s/124.53s/g' load_ml.log

awk

  • 如果要格式化报文或从一个大的文本文件中抽取数据包,那么awk可以完成这些任务
  • 操作符
    • = += *= / = %= ^ = 赋值操作符
    • ? 条件表达操作符
    • || && ! 并、与、非
    • ~! ~ 匹配操作符,包括匹配和不匹配
    • < <= == != >> 关系操作符
    • ++- - 前缀和后缀
  • 内置变量
    • ARGC 命令行参数个数
    • ARGV 命令行参数排列
    • ENVIRON 支持队列中系统环境变量的使用
    • FILENAME a w k浏览的文件名
    • FNR 浏览文件的记录数
    • FS 设置输入域分隔符,等价于命令行 - F选项
    • NF 浏览记录的域个数
    • NR 已读的记录数
    • ORS 输出记录分隔符
    • RS 控制记录分隔符
  • 内置字符串函数
    • gsub(r,s) 在整个$0中用s替代
    • rgsub(r,s,t) 在整个t中用s替代r
    • index(s,t) 返回s中字符串t的第一位置
    • length(s) 返回s长度
    • match(s,r) 测试s是否包含匹配r的字符串
    • split(s,a,fs) 在fs上将s分成序列
    • asprint(fmt,exp) 返回经fmt格式化后的
    • expsub(r,s) 用$0中最左边最长的子串代替s
    • substr(s,p) 返回字符串s中从p开始的后缀部分
    • substr(s,p,n) 返回字符串s中从p开始长度为n的后缀部分
  • 示例

    • 列出目录下的文件及总大小

      ls -l | awk ' /^[^d]/ {print $9"\t"$5} {tot+=$5} END {print tot}'

    • 模糊匹配

      awk -F"|" '{if($1~/s_gn_/)s+=$5} END {print s}' load_analyze_2014-12-07.log

    • 内置变量

      awk -F"/" '{print NF, NR, $0} END {print FILENAME}' url.txt

    • 数字计算

      awk -F"|" '{$5=$5/1024/1024;print $1"\t"$5}' load_analyze_2014-12-07.log

    • Substr

      [hadoop@centos6 log]$ str="1234567"
      [hadoop@centos6 log]$ echo $str | awk '{print substr($str, 1,5)}‘

    • 杀掉进程

      ps -ef | grep dispatch_day.sh | awk '{print $2}' | xargs kill -9

其他命令

  • sort
    • 对文本进行排序
    • 常用选项
      • -t 域分隔符
      • -k 域编号
      • -n 按数字排序
      • -r 倒序
    • 示例
      • sort -t"|" -k 5 -n -r load_analyze_2014-12-07.log
  • uniq
    • 用来从一个文本文件中去除或禁止重复行。一般 u n i q假定文件已分类,并且结果正确。
    • 常用选项
      • -u 只显示不重复行
      • -d 只显示有重复数据行,每种重复行只显示其中一行
      • -c 打印每一重复行出现次数。
      • -f n为数字,前 n个域被忽略。
    • 示例
      • awk -F"|" '{print $1"|"$5}' load_analyze_2014-12-07.log > a.log
      • uniq -c a.log
  • join
    • 用来将来自两个分类文本文件的行连在一起。
    • 常用选项
      • -o n.m n 为文件号, m为域号。 1 . 3 表示只显示文件 1 第三域,每个 n, m必须用逗号分隔,如1 . 3, 2 . 1 。
      • -j n m n为文件号, m为域号。使用其他域做连接域。
      • -t 域分隔符。用来设置非空格或 t a b键的域分隔符
    • 示例
      • join -j1 1 -j2 1 -t"|" a.log b.log
  • cut
    • 从标准输入或文本文件中剪切列或域
    • 选项
      • -c list 指定剪切字符数。 -c 1, 5-7 剪切第 1 个字符,然后是第 5到第7个字符。
      • -f field 指定剪切域数。 -f1,10-12 剪切第1域,第 1 0域到第 1 2域。
      • -d 指定与空格和 tab键不同的域分隔符
    • 示例
      • echo load_analyze_2014-12-07.log | cut -d “_” -f 1 | cut -c1-3
  • split
    • 将大文件分割成小文件
    • 选项
      • -output_file-size 行数,默认1000
    • 示例
      • split -4000 a.log
  • curl
    • 一个功能强大的网络工具,它能够通过http、ftp等方式下载文件,也能够上传文件。
    • 常用选项
      • -d/–data HTTP POST方式传送数据
      • -x/–proxy 指定代理服务器地址和端口,端口默认为1080
      • -O:按照服务器上的文件名,自动存在本地
      • -T/–upload-file 上传文件
      • -u/–user 设置服务器的用户和密码
    • 示例

基础编程

  • 条件测试
    • 表达式 [ condition ]
    • 文件状态
      • -d 目录
      • -s 文件长度大于 0、非空
      • -f 正规文件
      • -w 可写
      • -L 符号连接
      • -u 文件有 suid位设置
      • -r 可读
      • -x 可执行
    • 逻辑操作符
      • -a 逻辑与
      • -o 逻辑或
      • ! 逻辑否
    • 字符串比较
      • == 两个字符串相等。
      • != 两个字符串不等。
      • -z 空串。
      • -n 非空串。
    • 数字比较
      • -eq 数值相等。
      • -ne 数值不相等。
      • -gt 第一个数大于第二个数。
      • -lt 第一个数小于第二个数。
      • -le 第一个数小于等于第二个数。
      • -ge 第一个数大于等于第二个数
  • 控制流
    • If then else
    • case
    • for
    • until
    • While
    • Break and continue

Shell函数

  • 函数必须放在脚本主体前面
  • 函数通过return 或者echo返回值
  • 函数文件必须是完整路径
  • 示例
mv_log () {
    file=$1
    file_name=`echo $file | awk -F"," '{print $1}'`
    size=`echo $file | awk -F"," '{print $2}'`
    before_size=`cat $tmp_file | grep -w $file_name | awk -F"," '{print $2}'`
    if [ "$before_size" == "$size" ]
    then
        mv $file_name $dest_dir/${file_name} -f &
    else
        echo $file_name","$size >> $before_file
    fi
}

与其他配合

  • 多进程
    • 调用的函数或者命令后加 &
    • wait 等待后台进程结束
  • FTP
open 10.95.3.133
user $user $password
bin
cd pub #必须先cd,然后获取
get zlib-devel-1.2.3-29.el6.x86_64.rpm
quit
EOF``` 

#数据库
/opt/gcluster/server/bin/gbase -h$db_host -u$db_user -p$db_passwd -vvv -e "use $db_name; call p_g_dispatch_day('$data_time');" 

参考资料

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值