linux shell命令常用技巧

Linux系统提供了两个对Shell编程非常有用的特殊文件,/dev/null和/dev/tty。其中/dev/null将会丢掉所有写入它的数据,换句换说,当程序将数据写入到此文件时,会认为它已经成功完成写入数据的操作,但实际上什么事都没有做。如果你需要的是命令的退出状态,而非它的输出,此功能会非常有用,见如下Shell代码:

 代码如下 复制代码

    /> vi test_dev_null.sh
   
    #!/bin/bash
    if grep hello TestFile > /dev/null
    then
        echo "Found"
    else
        echo "NOT Found"
    fi
    在vi中保存并退出后执行以下命令:
    /> chmod +x test_dev_null.sh  #使该文件成为可执行文件
    /> cat > TestFile
    hello my friend
    CTRL + D                             #退出命令行文件编辑状态
    /> ./test_dev_null.sh
    Found                                 #这里并没有输出grep命令的执行结果。
    将以上Shell脚本做如下修改:
    /> vi test_dev_null.sh
   
    #!/bin/bash
    if grep hello TestFile
    then
        echo "Found"
    else
        echo "NOT Found"
    fi
    在vi中保存退出后,再次执行该脚本:
    /> ./test_dev_null.sh
    hello my friend                      #grep命令的执行结果被输出了。
    Found

    
    下面我们再来看/dev/tty的用途。当程序打开此文件是,Linux会自动将它重定向到一个终端窗口,因此该文件对于读取人工输入时特别有用。见如下Shell代码:

 代码如下 复制代码
    /> vi test_dev_tty.sh
   
    #!/bin/bash
    printf "Enter new password: "    #提示输入
    stty -echo                               #关闭自动打印输入字符的功能
    read password < /dev/tty         #读取密码
    printf "nEnter again: "             #换行后提示再输入一次
    read password2 < /dev/tty       #再读取一次以确认
    printf "n"                               #换行
    stty echo                                #记着打开自动打印输入字符的功能
    echo "Password = " $password #输出读入变量
    echo "Password2 = " $password2
    echo "All Done"

    在vi中保存并退出后执行以下命令:

 代码如下 复制代码

    /> chmod +x test_dev_tty.sh #使该文件成为可执行文件
    /> ./test_dev_tty
    Enter new password:             #这里密码的输入被读入到脚本中的password变量
    Enter again:                          #这里密码的输入被读入到脚本中的password2变量
    Password = hello
    Password2 = hello
    All Done

二.    简单的命令跟踪:

    Linux Shell提供了两种方式来跟踪Shell脚本中的命令,以帮助我们准确的定位程序中存在的问题。下面的代码为第一种方式,该方式会将Shell脚本中所有被执行的命令打印到终端,并在命令前加"+":加号的后面还跟着一个空格。

 代码如下 复制代码

    /> cat > trace_all_command.sh
    who | wc -l                          #这两条Shell命令将输出当前Linux服务器登录的用户数量
    CTRL + D                            #退出命令行文件编辑状态
    /> chmod +x trace_all_command.sh
    /> sh -x ./trace_all_command.sh #Shell执行器的-x选项将打开脚本的执行跟踪功能。
    + wc -l                               #被跟踪的两条Shell命令
    + who
    2                                       #实际输出结果。
    Linux Shell提供的另一种方式可以只打印部分被执行的Shell命令,该方法在调试较为复杂的脚本时,显得尤为有用。
    /> cat > trace_patial_command.sh
    #! /bin/bash
    set -x                                #从该命令之后打开跟踪功能
    echo 1st echo                     #将被打印输出的Shell命令
    set +x                               #该Shell命令也将被打印输出,然而在该命令被执行之后,所有的命令将不再打印输出
    echo 2nd echo                    #该Shell命令将不再被打印输出。
    CTRL + D                           #退出命令行文件编辑状态
    /> chmod +x trace_patial_command.sh
    /> ./trace_patial_command.sh
    + echo 1st echo
    1st echo
    + set +x
    2nd echo

  
三.    正则表达式基本语法描述:

    Linux Shell环境下提供了两种正则表达式规则,一个是基本正则表达式(BRE),另一个是扩展正则表达式(ERE)。
    下面是这两种表达式的语法列表,需要注意的是,如果没有明确指出的Meta字符,其将可同时用于BRE和ERE,否则将尽适用于指定的模式。
    正则Meta字符     模式含义                                                                   用例
                        通常用于关闭其后续字符的特殊意义,恢复其原意。    (...),这里的括号仅仅表示括号。
    .                    匹配任何单个字符。                                           a.b,将匹配abb、acb等               
    *                   匹配它之前的0-n个的单个字符。                           a*b,将匹配ab、aab、aaab等。
    ^                  匹配紧接着的正则表达式,在行的起始处。               ^ab,将匹配abc、abd等,但是不匹配cab。
    $                   匹配紧接着的正则表达式,在行的结尾处。               ab$,将匹配ab、cab等,但是不匹配abc。
    [...]               方括号表达式,匹配其内部任何字符。其中-表示连      [a-bA-Z0-9!]表示所有的大小写字母,数字和
                        续字符的范围,^符号置于方括号里第一个字符则有      感叹号。[^abc]表示a、b、c之外的所有字符。
                        反向的含义,即匹配不在列表内(方括号)的任何字符。   [Tt]om,可以匹配Tom和tom。
                        如果想让]和-表示其原意,需要将其放置在方括号的
                        首字符位置,如[]ab]或[-ab],如这两个字符同时存
                        在,则将]放置在首字符位置,-放置在最尾部,如
                        []ab-]。
    {n,m}          区间表达式,匹配在它前面的单个字符重复出现的次    ab{2}表示abb;ab{2,}表示abb、abbb等。
                        数区间,{n}表示重复n次;{n,}表示至少重复n     ab{2,4}表示abb、abbb和abbbb。
                        次;{n,m}表示重复n到m次。
    (...)            将圆括号之间的模式存储在特殊“保留空间”。最多可      (ab).*1表示ab组合出现两次,两次之间可存
                        以将9个独立的子模式存储在单个模式中。匹配于子      在任何数目的任何字符,如abcdab、abab等。
                        模式的文本,可以通过转义序列1到9,被重复使用
                        在相同模式里。
    {n,m}(ERE)     其功能等同于上面的{n,m},只是不再写转义符了。 ab+匹配ab、abbb等,但是不匹配a。
    +(ERE)           和前面的星号相比,+匹配的是前面正则表达式的1-n   
                        个实例。
    ?(ERE)           匹配前面正则表达式的0个或1个。                            ab?仅匹配a或ab。
    |(ERE)           匹配于|符号前后的正则表达式。                               (ab|cd)匹配ab或cd。
    [:alpha:]        匹配字母字符。                                                    [[:alpha:]!]ab$匹配cab、dab和!ab。
    [:alnum:]       匹配字母和数字字符。                                           [[:alnum:]]ab$匹配1ab、aab。
    [:blank:]        匹配空格(space)和Tab字符。
    [:cntrl:]         匹配控制字符。
    [:digit:]         匹配数字字符。
    [:graph:]       匹配非空格字符。
    [:lower:]        匹配小写字母字符。
    [:upper:]       匹配大写字母字符。
    [:punct:]       匹配标点字符。
    [:space:]       匹配空白(whitespace)字符。
    [:xdigit:]       匹配十六进制数字。
    w                匹配任何字母和数字组成的字符,等同于[[:alnum:]_]
    W               匹配任何非字母和数字组成的字符,等同于[^[:alnum:]_]
    <>             匹配单词的起始和结尾。                                          <read匹配readme,me>匹配readme。
   
    下面的列表给出了Linux Shell中常用的工具或命令分别支持的正则表达式的类型。
            grep    sed    vi    egrep/"grep -E"    awk
    BRE       *      *     *  
    ERE                                                      *       *
   
四.    使用cut命令选定字段:

    cut命令是用来剪下文本文件里的数据,文本文件可以是字段类型或是字符类型。下面给出应用实例:

 代码如下 复制代码

    /> cat /etc/passwd
    root:x:0:0:root:/root:/bin/bash
    bin:x:1:1:bin:/bin:/sbin/nologin
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    adm:x:3:4:adm:/var/adm:/sbin/nologin
    ... ...
    /> cut -d : -f 1,5 /etc/passwd     #-d后面的冒号表示字段之间的分隔符,-f表示取分割后的哪些字段
    root:root                                 #这里取出的是第一个和第五个字段。
    bin:bin
    daemon:daemon
    adm:adm
    ... ...

    
    这里需要进一步说明的是,使用cut命令还可以剪切以字符数量为标量的部分字符,该功能通过-c选项实现,其不能与-d选项共存。

 代码如下 复制代码

    /> cut -c 1-4 /etc/passwd          #取每行的前1-4个字符。
    /> cut -c-4 /etc/passwd            #取每行的前4个字符。
    root
    bin:
    daem
    adm:
    ... ...
    /> cut -c4- /etc/passwd            #取每行的第4个到最后字符。
    t:x:0:0:root:/root:/bin/bash
    :x:1:1:bin:/bin:/sbin/nologin
    mon:x:2:2:daemon:/sbin:/sbin/nologin
    :x:3:4:adm:/var/adm:/sbin/nologin
    ... ...
    /> cut -c1,4 /etc/passwd           #取每行的第一个和第四个字符。
    rt
    b:
    dm
    a:
    ... ...
    /> cut -c1-4,5 /etc/passwd        #取每行的1-4和第5个字符。
    root:
    bin:x
    daemo
    adm:x

五.    计算行数、字数以及字符数:

    Linux提供了一个简单的工具wc用于完成该功能,见如下用例:

 代码如下 复制代码

    /> echo This is a test of the emergency broadcast system | wc
    1    9    49                              #1行,9个单词,49个字符
    /> echo Testing one two three | wc -c
    22                                         #22个字符
    /> echo Testing one two three | wc -l
    1                                           #1行
    /> echo Testing one two three | wc -w
    4                                           #4个单词
    /> wc /etc/passwd /etc/group    #计算两个文件里的数据。
    39   71  1933  /etc/passwd
    62   62  906    /etc/group
    101 133 2839  总用量

   
六.    提取开头或结尾数行:

    有时,你会需要从文本文件里把几行字,多半是靠近开头或结尾的几行提取出来。如查看工作日志等操作。Linux Shell提供head和tail两个命令来完成此项工作。见如下用例:

 代码如下 复制代码
    /> head -n 5 /etc/passwd           #显示输入文件的前五行。
    root:x:0:0:root:/root:/bin/bash
    bin:x:1:1:bin:/bin:/sbin/nologin
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    adm:x:3:4:adm:/var/adm:/sbin/nologin
    lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
   
    /> tail -n 5 /etc/passwd             #显示输入文件的最后五行。
    sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
    mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/bash
    pulse:x:496:494:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin
    gdm:x:42:42::/var/lib/gdm:/sbin/nologin
    stephen:x:500:500:stephen:/home/stephen:/bin/bash

    如果使用者想查看不间断增长的日志(如服务程序输出的),可以使用tail的-f选项,这样可以让tail命令不会自动退出,必须通过CTRL+C命令强制退出,因此该选项不适合用于Shell脚本中,见如下用例:
    /> tail -f -n 5 my_server_log
    ... ...
    ^C                                         #CTRL+C退出到命令行提示符状态

时间: 2024-11-03 21:57:56

linux shell命令常用技巧的相关文章

linux shell 命令

linux shell 命令 什么是Shell? Shell 是连接操作系统内核 与 用户 的接口. 终端是shell的表现形式. Linux的内核版本号由三部分组成:主版本号.次版本号.修正号.次版本号有其他含义:奇数为测试版,偶数为稳定版. 常见的linux发行版有 Fedora.Ubuntu等. 什么是Shell编程? Shell 脚本语言加上linux 命令语句就构成了shell程序.优点在于批量处理.不用用户每次手动输入. bash是shell程序解释器的一种.  常用命令 Shell

linux shell命令行下curl问题。。。,,

问题描述 linux shell命令行下curl问题...,, curl -d 之后收到网页的返回数据,是代表发送成功了么 如果是成功了,为什么我么有收到短信呢 如果没成功,应该怎么发送一个post数据呢 解决方案 关于curl命令行下载页面为空的问题 解决方案二: curl -d只是post的数据过去,你要看发挥的信息是否有提示成功.

脚本-新人提问很多linux shell命令

问题描述 新人提问很多linux shell命令 我现在在看linux shell脚本攻略第二版,看完第二章之后,里面有好几条shell命令我看不懂,请大神来每条命令不吝赐教一下 1.$ find . -type f -name "*.c" -exec cat {} ; all_c_file.txt,这条命令我想问-exec后面是什么意思? 2.$ find . -type f -mtime +10 -name "*.txt" -exec cp {} OLD ; 3

linux shell命令行选项与参数用法详解_linux shell

问题描述:在linux shell中如何处理tail -n 10 access.log这样的命令行选项?在bash中,可以用以下三种方式来处理命令行参数,每种方式都有自己的应用场景.1,直接处理,依次对$1,$2,...,$n进行解析,分别手工处理:2,getopts来处理,单个字符选项的情况(如:-n 10 -f file.txt等选项):3,getopt,可以处理单个字符选项,也可以处理长选项long-option(如:--prefix=/home等).总结:小脚本手工处理即可,getopt

Linux系统Shell命令常用功能使用详解

  Linux系统中Shell不仅仅是一个命令,而且是其他命令的解释器.可以调试其他命令,从而完成编译.那么Linux系统中Shell命令应该怎么使用呢? 其实作为命令语言互动式地解释和执行用户输入的命令只是Shell功能的一个方面,Shell还可以用来进行程序设计,它提供了定义变量和参数的手段以及丰富的程序控制结构.使用Shell编程类似于DOS中的批处理文件,称为Shell script,又叫Shell程序或Shell命令文件. Shell基本语法 像高级程序设计语言一样,Shell也提供说

Linux shell用法和技巧(转)

使用Linux shell是我每天的基本工作,但我经常会忘记一些有用的shell命令和l技巧.当然,命令我能记住,但我不敢说能记得如何用它执行某个特定任务.于是,我开始在一个文本文件里记录这些用法,并放在我的Dropbox里,现在,向大家分享这个文件.这个文件我会不断的更新.需要注意一点的是,有些用法需要在你的Linux系统里安装额外的软件. UPDATE: November 25, 2013 检查远程端口是否对bash开放: echo >/dev/tcp/8.8.8.8/53 &&

linux shell命令行参数用法详解_linux shell

习惯使用linux命令行来管理linux系统,例如: 复制代码 代码如下: $ date 二 11 23 01:34:58 CST 1999  $ 用户登录时,实际进入了shell,它遵循一定的语法将输入的命令加以解释并传给系统.命令行中输入的第一个字必须是一个命令的名字,第二个字是命令的选项或参数,命令行中的每个字必须由空格或TAB隔开,格式如下:  复制代码 代码如下: $ Command Option Arguments 一,选项和参数  选项是包括一个或多个字母的代码,它前面有一个减号(

Linux Shell 编程实战技巧

避免定时任务脚本的常见问题 很多脚本在实际使用的时候往往是以定时任务的方式运行,而非手工运行.但是实现同样功能的脚本在这两种运行方式下可能遇到的问题不尽相同. 以定时任务方式运行的脚本往往会遇到以下几个问题. 路径问题:当前目录往往不是脚本文件所在目录.因此,脚本在引用其使用的外部文件,如配置文件和其它脚本文件时,无法方便得使用相对路径. 命令找不到问题:脚本中使用到的一些外部命令,在手工执行脚本的时候可以正常调用.但是在定时任务下运行则可能出现脚本解析器找不到相关命令的问题. 脚本重复运行问题

Linux shell命令行操作指南

Linux shell指的是一种程序,有了它,用户就能通过键盘输入指令来操作计算机了.Shell会执行http://www.aliyun.com/zixun/aggregation/18678.html">用户输入的命令,并且在显示器上显示执行结果.这种交互的全过程都是基于文本的,与其他各章介绍的图形化操作不同.这种面向命令行的用户界面被称为CLI(Command Line interface).在图形化用户界面(GUI)出现之前,人们一直是通过命令行界面来操作计算机的.现在,基于图形界面