Linux Shell常用技巧(一)

时间:2023-02-08 09:15:49

一.    特殊文件: /dev/null和/dev/tty

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,否则将尽适用于指定的模式。

正则元字符 模式含义 用例
\ 通常用于关闭其后续字符的特殊意义,恢复其原意。 \(...\),这里的括号仅仅表示括号。
. 匹配任何单个字符。 a.b,将匹配abb、acb等
* 匹配它之前的0-n个的单个字符。 a*b,将匹配ab、aab、aaab等。
^ 匹配紧接着的正则表达式,在行的起始处。 ^ab,将匹配abc、abd等,但是不匹配cab。
$ 匹配紧接着的正则表达式,在行的结尾处。 ab$,将匹配ab、cab等,但是不匹配abc。
[...] 方括号表达式,匹配其内部任何字符。其中-表示连续字符的范围,^符号置于方括号里第一个字符则有反向的含义,即匹配不在列表内(方括号)的任何字符。如果想让]和-表示其原意,需要将其放置在方括号的首字符位置,如[]ab]或[-ab],如这两个字符同时存在,则将]放置在首字符位置,-放置在最尾部,如[]ab-]。 [a-bA-Z0-9!]表示所有的大小写字母,数字和感叹号。[^abc]表示a、b、c之外的所有字符。[Tt]om,可以匹配Tom和tom。
\{n,m\} 区间表达式,匹配在它前面的单个字符重复出现的次数区间,\{n\}表示重复n次;\{n,\}表示至少重复n次;\{n,m\}表示重复n到m次。 ab\{2\}表示abb;ab\{2,\}表示abb、abbb等。ab\{2,4\}表示abb、abbb和abbbb。
\(...\) 将圆括号之间的模式存储在特殊“保留空间”。最多可以将9个独立的子模式存储在单个模式中。匹配于子模式的文本,可以通过转义序列\1到\9,被重复使用在相同模式里。 \(ab\).*\1表示ab组合出现两次,两次之间可存在任何数目的任何字符,如abcdab、abab等。
{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字符。 [[:alnum:]]ab$匹配1ab、aab。
[:cntrl:] 匹配控制字符。  
[:digit:] 匹配数字字符。  
[:graph:] 匹配非空格字符。  
[:lower:] 匹配小写字母字符。  
[:upper:] 匹配大写字母字符。  
[:punct:] 匹配标点字符。  
[:space:] 匹配空白(whitespace)字符。  
[:xdigit:] 匹配十六进制数字。  
\w 匹配任何字母和数字组成的字符,等同于[[:alnum:]_]  
\W 匹配任何非字母和数字组成的字符,等同于[^[:alnum:]_]  
\<\> 匹配单词的起始和结尾。 \<read匹配readme,me\>匹配readme。

下面的列表给出了Linux Shell中常用的工具或命令分别支持的正则表达式的类型。

  grep sed vi egrep 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 -d: -f 3- /etc/passwd       #从第三个字段开始显示,直到最后一个字段。
    0:0:root:/root:/bin/bash
    1:1:bin:/bin:/sbin/nologin
    2:2:daemon:/sbin:/sbin/nologin
    3:4:adm:/var/adm:/sbin/nologin
    4:7:lp:/var/spool/lpd:/sbin/nologin
    ... ...    
    这里需要进一步说明的是,使用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退出到命令行提示符状态。

Linux Shell常用技巧(一)的更多相关文章

  1. 【shell 大系】Linux Shell常用技巧

    在最近的日常工作中由于经常会和Linux服务器打交道,如Oracle性能优化.我们数据采集服务器的资源利用率监控,以及Debug服务器代码并解决其效率和稳定性等问题.因此这段时间总结的有关Linux ...

  2. Linux Shell常用技巧&lpar;目录&rpar;

    Linux Shell常用技巧(一) http://www.cnblogs.com/stephen-liu74/archive/2011/11/10/2240461.html一. 特殊文件: /dev ...

  3. &lbrack;转帖&rsqb;Linux Shell常用技巧&lpar;五&rpar;

    Linux Shell常用技巧(五) https://zhuanlan.zhihu.com/p/73451771 1. 变量:在awk中变量无须定义即可使用,变量在赋值时即已经完成了定义.变量的类型可 ...

  4. &lbrack;转帖&rsqb;拿小本本记下的Linux Shell常用技巧&lpar;一&rpar;

    拿小本本记下的Linux Shell常用技巧(一) https://zhuanlan.zhihu.com/p/73361101 一. 特殊文件: /dev/null和/dev/tty Linux系统提 ...

  5. Linux Shell常用技巧

    转载自http://www.cnblogs.com/stephen-liu74/ 一.    特殊文件: /dev/null和/dev/tty Linux系统提供了两个对Shell编程非常有用的特殊文 ...

  6. Linux Shell常用技巧&lpar;一&rpar; RE

    一.    特殊文件: /dev/null和/dev/tty Linux系统提供了两个对Shell编程非常有用的特殊文件,/dev/null和/dev/tty.其中/dev/null将会丢掉所有写入它 ...

  7. Linux Shell常用技巧&lpar;七&rpar;

    十六. 文件查找命令find: 下面给出find命令的主要应用示例:    /> ls -l     #列出当前目录下所包含的测试文件    -rw-r--r--. 1 root root 48 ...

  8. Linux Shell常用技巧&lpar;九&rpar;

    十九.  和系统运行进程相关的Shell命令:       1.  进程监控命令(ps):    要对进程进行监测和控制,首先必须要了解当前进程的情况,也就是需要查看当前进程,而ps命令就是最基本同时 ...

  9. Linux Shell常用技巧&lpar;八&rpar;

    十八.  和系统运行状况相关的Shell命令:    1.  Linux的实时监测命令(watch):    watch 是一个非常实用的命令,可以帮你实时监测一个命令的运行结果,省得一遍又一遍的手动 ...

随机推荐

  1. Action&period;c&lpar;58&rpar;&colon; Error -27796&colon; Failed to connect to server &quot&semi;hostname&quot&semi;

    分析: 因为负载生成器的性能太好发数据特别快,服务器响应也特别快,从而导致负载生成器的端口在没有timeout之前就全部占满了. 解决方案一:   在负载生成器的注册表HKEY_LOCAL_MACHI ...

  2. Mac版PhpStorm之XAMPP整合apache服务器配置

    版权声明:本文为博主原创文章,未经博主允许不得转载. 选择在PhpStorm集成apache服务器,下面是我自己的亲测的步骤. 1.如何修改apache默认端口 xampp apache默认的http ...

  3. codeforces 731C(DFS)

    题目链接:http://codeforces.com/contest/731/problem/C 题意:有n只袜子(1~n),k种颜色(1~k),在m天中,左脚穿下标为l,右脚穿下标为r的袜子,问最少 ...

  4. paramiko模块使用

    paramiko是一个用于做远程控制的模块,使用该模块可以对远程服务器进行命令或文件操作,fabric和ansible内部远程管理就是使用paramiko来实现. #!/usr/bin/env pyt ...

  5. s3c6410&lowbar;u-boot-2010&period;03移植

    开发环境: 开发板 FriendlyARM Tiny6410 主机 CentOS release 6.4 (Final) 参考: http://www.cnblogs.com/plinx/archiv ...

  6. POJ 2255 Tree Recovery&lpar;根据前序遍历和中序遍历,输出后序遍历&rpar;

    题意:给出一颗二叉树的前序遍历和中序遍历的序列,让你输出后序遍历的序列. 思路:见代码,采用递归. #include <iostream> #include <stdio.h> ...

  7. 【BZOJ】1070&colon; &lbrack;SCOI2007&rsqb;修车

    1070: [SCOI2007]修车 Description 同 一时刻有N位车主带着他们的爱车来到了汽车维修中心.维修中心共有M位技术人员,不同的技术人员对不同的车进行维修所用的时间是不同的.现在需 ...

  8. 业务逻辑 &colon; 未完 &colon; easybook&period;com

    Content>social media facebook, twitter, google+, instagram, pinterest (Question : How to update n ...

  9. 通过VuePress管理项目文档&lpar;一&rpar;

    VuePress 相关链接 完整的Vue组件代码以及完整的文档,仅适用于个人参考学习: 文档预览地址:预览链接 使用VuePress编辑文档的代码访问:组件文档 完整代码:组件代码 Vue组件开发 这 ...

  10. 正则 re模块

    Python 正则表达式 re 模块 简介 正则表达式(regular expression)是可以匹配文本片段的模式.最简单的正则表达式就是普通字符串,可以匹配其自身.比如,正则表达式 ‘hello ...