Linux Shell常用技巧(一)
本文转自 http://www.cnblogs.com/stephen-liu74/archive/2011/11/10/2240461.html
?
一.?? ?特殊文件: /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,否则将尽适用于指定的模式。
?? ?下面的列表给出了Linux Shell中常用的工具或命令分别支持的正则表达式的类型。
四.?? ?使用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退出到命令行提示符状态。