找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 4584|回复: 0

Linux Shell常用技巧(一)

[复制链接]
发表于 2012-4-21 10:12:36 | 显示全部楼层 |阅读模式
  1. 一.    特殊文件: /dev/null和/dev/tty
  2.     Linux系统提供了两个对Shell编程非常有用的特殊文件,/dev/null和/dev/tty。其中/dev/null将会丢掉所有写入它的数据,换句换说,当程序将数据写入到此文件时,会认为它已经成功完成写入数据的操作,但实际上什么事都没有做。如果你需要的是命令的退出状态,而非它的输出,此功能会非常有用,见如下Shell代码:
  3.     /> vi test_dev_null.sh
  4.    
  5.     #!/bin/bash
  6.     if grep hello TestFile > /dev/null
  7.     then
  8.         echo "Found"
  9.     else
  10.         echo "NOT Found"
  11.     fi
  12.     在vi中保存并退出后执行以下命令:
  13.     /> chmod +x test_dev_null.sh  #使该文件成为可执行文件
  14.     /> cat > TestFile
  15.     hello my friend
  16.     CTRL + D                             #退出命令行文件编辑状态
  17.     /> ./test_dev_null.sh
  18.     Found                                 #这里并没有输出grep命令的执行结果。
  19.     将以上Shell脚本做如下修改:
  20.     /> vi test_dev_null.sh
  21.    
  22.     #!/bin/bash
  23.     if grep hello TestFile
  24.     then
  25.         echo "Found"
  26.     else
  27.         echo "NOT Found"
  28.     fi
  29.     在vi中保存退出后,再次执行该脚本:
  30.     /> ./test_dev_null.sh
  31.     hello my friend                      #grep命令的执行结果被输出了。
  32.     Found
  33.    
  34.     下面我们再来看/dev/tty的用途。当程序打开此文件是,Linux会自动将它重定向到一个终端窗口,因此该文件对于读取人工输入时特别有用。见如下Shell代码:
  35.     /> vi test_dev_tty.sh
  36.    
  37.     #!/bin/bash
  38.     printf "Enter new password: "    #提示输入
  39.     stty -echo                               #关闭自动打印输入字符的功能
  40.     read password < /dev/tty         #读取密码
  41.     printf "\nEnter again: "             #换行后提示再输入一次
  42.     read password2 < /dev/tty       #再读取一次以确认
  43.     printf "\n"                               #换行
  44.     stty echo                                #记着打开自动打印输入字符的功能
  45.     echo "Password = " $password #输出读入变量
  46.     echo "Password2 = " $password2
  47.     echo "All Done"
  48.     在vi中保存并退出后执行以下命令:
  49.     /> chmod +x test_dev_tty.sh #使该文件成为可执行文件
  50.     /> ./test_dev_tty
  51.     Enter new password:             #这里密码的输入被读入到脚本中的password变量
  52.     Enter again:                          #这里密码的输入被读入到脚本中的password2变量
  53.     Password = hello
  54.     Password2 = hello
  55.     All Done
  56. 二.    简单的命令跟踪:
  57.     Linux Shell提供了两种方式来跟踪Shell脚本中的命令,以帮助我们准确的定位程序中存在的问题。下面的代码为第一种方式,该方式会将Shell脚本中所有被执行的命令打印到终端,并在命令前加"+":加号的后面还跟着一个空格。
  58.     /> cat > trace_all_command.sh
  59.     who | wc -l                          #这两条Shell命令将输出当前Linux服务器登录的用户数量
  60.     CTRL + D                            #退出命令行文件编辑状态
  61.     /> chmod +x trace_all_command.sh
  62.     /> sh -x ./trace_all_command.sh #Shell执行器的-x选项将打开脚本的执行跟踪功能。
  63.     + wc -l                               #被跟踪的两条Shell命令
  64.     + who
  65.     2                                       #实际输出结果。
  66.     Linux Shell提供的另一种方式可以只打印部分被执行的Shell命令,该方法在调试较为复杂的脚本时,显得尤为有用。
  67.     /> cat > trace_patial_command.sh
  68.     #! /bin/bash
  69.     set -x                                #从该命令之后打开跟踪功能
  70.     echo 1st echo                     #将被打印输出的Shell命令
  71.     set +x                               #该Shell命令也将被打印输出,然而在该命令被执行之后,所有的命令将不再打印输出
  72.     echo 2nd echo                    #该Shell命令将不再被打印输出。
  73.     CTRL + D                           #退出命令行文件编辑状态
  74.     /> chmod +x trace_patial_command.sh
  75.     /> ./trace_patial_command.sh
  76.     + echo 1st echo
  77.     1st echo
  78.     + set +x
  79.     2nd echo
  80.    
  81. 三.    正则表达式基本语法描述:
  82.     Linux Shell环境下提供了两种正则表达式规则,一个是基本正则表达式(BRE),另一个是扩展正则表达式(ERE)。
  83.     下面是这两种表达式的语法列表,需要注意的是,如果没有明确指出的Meta字符,其将可同时用于BRE和ERE,否则将尽适用于指定的模式。
  84. 正则元字符        模式含义        用例
  85. \        通常用于关闭其后续字符的特殊意义,恢复其原意。        \(...\),这里的括号仅仅表示括号。
  86. .        匹配任何单个字符。        a.b,将匹配abb、acb等
  87. *        匹配它之前的0-n个的单个字符。        a*b,将匹配ab、aab、aaab等。
  88. ^        匹配紧接着的正则表达式,在行的起始处。        ^ab,将匹配abc、abd等,但是不匹配cab。
  89. nbsp;       匹配紧接着的正则表达式,在行的结尾处。        ab$,将匹配ab、cab等,但是不匹配abc。
  90. [...]        方括号表达式,匹配其内部任何字符。其中-表示连续字符的范围,^符号置于方括号里第一个字符则有反向的含义,即匹配不在列表内(方括号)的任何字符。如果想让]和-表示其原意,需要将其放置在方括号的首字符位置,如[]ab]或[-ab],如这两个字符同时存在,则将]放置在首字符位置,-放置在最尾部,如[]ab-]。        [a-bA-Z0-9!]表示所有的大小写字母,数字和感叹号。[^abc]表示a、b、c之外的所有字符。[Tt]om,可以匹配Tom和tom。
  91. \{n,m\}        区间表达式,匹配在它前面的单个字符重复出现的次数区间,\{n\}表示重复n次;\{n,\}表示至少重复n次;\{n,m\}表示重复n到m次。        ab\{2\}表示abb;ab\{2,\}表示abb、abbb等。ab\{2,4\}表示abb、abbb和abbbb。
  92. \(...\)        将圆括号之间的模式存储在特殊“保留空间”。最多可以将9个独立的子模式存储在单个模式中。匹配于子模式的文本,可以通过转义序列\1到\9,被重复使用在相同模式里。        \(ab\).*\1表示ab组合出现两次,两次之间可存在任何数目的任何字符,如abcdab、abab等。
  93. {n,m}(ERE)        其功能等同于上面的\{n,m\},只是不再写\转义符了。        ab+匹配ab、abbb等,但是不匹配a。
  94. +(ERE)        和前面的星号相比,+匹配的是前面正则表达式的1-n个实例。         
  95. ?(ERE)        匹配前面正则表达式的0个或1个。        ab?仅匹配a或ab。
  96. |(ERE)        匹配于|符号前后的正则表达式。        (ab|cd)匹配ab或cd。
  97. [:alpha:]        匹配字母字符。        [[:alpha:]!]ab$匹配cab、dab和!ab。
  98. [:alnum:]        匹配字母和数字字符。        [[:alnum:]]ab$匹配1ab、aab。
  99. [:blank:]        匹配空格(space)和Tab字符。        [[:alnum:]]ab$匹配1ab、aab。
  100. [:cntrl:]        匹配控制字符。         
  101. [:digit:]        匹配数字字符。         
  102. [:graph:]        匹配非空格字符。         
  103. [:lower:]        匹配小写字母字符。         
  104. [:upper:]        匹配大写字母字符。         
  105. [:punct:]        匹配标点字符。         
  106. [:space:]        匹配空白(whitespace)字符。         
  107. [:xdigit:]        匹配十六进制数字。         
  108. \w        匹配任何字母和数字组成的字符,等同于[[:alnum:]_]         
  109. \W        匹配任何非字母和数字组成的字符,等同于[^[:alnum:]_]         
  110. \<\>        匹配单词的起始和结尾。        \<read匹配readme,me\>匹配readme。
  111.     下面的列表给出了Linux Shell中常用的工具或命令分别支持的正则表达式的类型。
  112.          grep        sed        vi        egrep        awk
  113. BRE        *        *        *                  
  114. ERE                                   *        *
  115. 四.    使用cut命令选定字段:
  116.     cut命令是用来剪下文本文件里的数据,文本文件可以是字段类型或是字符类型。下面给出应用实例:
  117.     /> cat /etc/passwd
  118.     root:x:0:0:root:/root:/bin/bash
  119.     bin:x:1:1:bin:/bin:/sbin/nologin
  120.     daemon:x:2:2:daemon:/sbin:/sbin/nologin
  121.     adm:x:3:4:adm:/var/adm:/sbin/nologin
  122.     ... ...
  123.     /> cut -d : -f 1,5 /etc/passwd     #-d后面的冒号表示字段之间的分隔符,-f表示取分割后的哪些字段
  124.     root:root                                 #这里取出的是第一个和第五个字段。
  125.     bin:bin
  126.     daemon:daemon
  127.     adm:adm
  128.     ... ...
  129.     /> cut -d: -f 3- /etc/passwd       #从第三个字段开始显示,直到最后一个字段。
  130.     0:0:root:/root:/bin/bash
  131.     1:1:bin:/bin:/sbin/nologin
  132.     2:2:daemon:/sbin:/sbin/nologin
  133.     3:4:adm:/var/adm:/sbin/nologin
  134.     4:7:lp:/var/spool/lpd:/sbin/nologin
  135.     ... ...   
  136.     这里需要进一步说明的是,使用cut命令还可以剪切以字符数量为标量的部分字符,该功能通过-c选项实现,其不能与-d选项共存。
  137.     /> cut -c 1-4 /etc/passwd          #取每行的前1-4个字符。
  138.     /> cut -c-4 /etc/passwd            #取每行的前4个字符。
  139.     root
  140.     bin:
  141.     daem
  142.     adm:
  143.     ... ...
  144.     /> cut -c4- /etc/passwd            #取每行的第4个到最后字符。
  145.     t:x:0:0:root:/root:/bin/bash
  146.     :x:1:1:bin:/bin:/sbin/nologin
  147.     mon:x:2:2:daemon:/sbin:/sbin/nologin
  148.     :x:3:4:adm:/var/adm:/sbin/nologin
  149.     ... ...
  150.     /> cut -c1,4 /etc/passwd           #取每行的第一个和第四个字符。
  151.     rt
  152.     b:
  153.     dm
  154.     a:
  155.     ... ...
  156.     /> cut -c1-4,5 /etc/passwd        #取每行的1-4和第5个字符。
  157.     root:
  158.     bin:x
  159.     daemo
  160.     adm:x
  161. 五.    计算行数、字数以及字符数:
  162.     Linux提供了一个简单的工具wc用于完成该功能,见如下用例:
  163.     /> echo This is a test of the emergency broadcast system | wc
  164.     1    9    49                              #1行,9个单词,49个字符
  165.     /> echo Testing one two three | wc -c
  166.     22                                         #22个字符
  167.     /> echo Testing one two three | wc -l
  168.     1                                           #1行
  169.     /> echo Testing one two three | wc -w
  170.     4                                           #4个单词
  171.     /> wc /etc/passwd /etc/group    #计算两个文件里的数据。
  172.     39   71  1933  /etc/passwd
  173.     62   62  906    /etc/group
  174.     101 133 2839  总用量
  175. 六.    提取开头或结尾数行:
  176.     有时,你会需要从文本文件里把几行字,多半是靠近开头或结尾的几行提取出来。如查看工作日志等操作。Linux Shell提供head和tail两个命令来完成此项工作。见如下用例:
  177.     /> head -n 5 /etc/passwd           #显示输入文件的前五行。
  178.     root:x:0:0:root:/root:/bin/bash
  179.     bin:x:1:1:bin:/bin:/sbin/nologin
  180.     daemon:x:2:2:daemon:/sbin:/sbin/nologin
  181.     adm:x:3:4:adm:/var/adm:/sbin/nologin
  182.     lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
  183.     /> tail -n 5 /etc/passwd             #显示输入文件的最后五行。
  184.     sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
  185.     mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/bash
  186.     pulse:x:496:494:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin
  187.     gdm:x:42:42::/var/lib/gdm:/sbin/nologin
  188.     stephen:x:500:500:stephen:/home/stephen:/bin/bash
  189.     如果使用者想查看不间断增长的日志(如服务程序输出的),可以使用tail的-f选项,这样可以让tail命令不会自动退出,必须通过CTRL+C命令强制退出,因此该选项不适合用于Shell脚本中,见如下用例:
  190.     /> tail -f -n 5 my_server_log
  191.     ... ...
  192.     ^C                                         #CTRL+C退出到命令行提示符状态。
  193. 分类: Linux Shell
复制代码

来自:http://www.cnblogs.com/stephen-l ... /11/10/2240461.html


目录:

Linux Shell常用技巧(一)
http://www.acejoy.com/thread-4312-1-1.html
一. 特殊文件: /dev/null和/dev/tty
二. 简单的命令跟踪
三. 正则表达式基本语法描述
四. 使用cut命令选定字段
五. 计算行数、字数以及字符数
六. 提取开头或结尾数行

Linux Shell常用技巧(二)
http://www.acejoy.com/thread-4313-1-1.html
七. grep家族

Linux Shell常用技巧(三)
http://www.acejoy.com/thread-4314-1-1.html
八. 流编辑器sed

Linux Shell常用技巧(四)
http://www.acejoy.com/thread-4315-1-1.html
九. awk实用功能
十. awk表达式功能

Linux Shell常用技巧(五)
http://www.acejoy.com/thread-4316-1-1.html
十一.awk编程

Linux Shell常用技巧(六)
http://www.acejoy.com/thread-4317-1-1.html
十二.行的排序命令sort
十三.删除重复行的命令uniq
十四.文件压缩解压命令tar
十五.大文件拆分命令split

Linux Shell常用技巧(七)
http://www.acejoy.com/thread-4318-1-1.html
十六.文件查找命令find
十七.xargs命令

Linux Shell常用技巧(八)
http://www.acejoy.com/thread-4319-1-1.html
十八.和系统运行状况相关的Shell命令

Linux Shell常用技巧(九)
http://www.acejoy.com/thread-4320-1-1.html
十九.和系统运行进程相关的Shell命令

Linux Shell常用技巧(十)
http://www.acejoy.com/thread-4321-1-1.html
二十.通过管道组合Shell命令获取系统运行数据
二十一.通过管道组合Shell命令进行系统管理

Linux Shell常用技巧(十一)
http://www.acejoy.com/thread-4322-1-1.html
二十二.交互式使用Bash Shell

Linux Shell常用技巧(十二)
http://www.acejoy.com/thread-4323-1-1.html
二十三.Bash Shell编程

您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-5-8 07:02 , Processed in 0.189841 second(s), 6 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表