拿小本本记下的Linux Shell常用技巧(一)

https://zhuanlan.zhihu.com/p/73361101

一. 特殊文件: /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中常用的工具或命令分别支持的正则表达式的类型。

grepsedviegrepawkBRE*** 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. [转帖]Linux Shell常用技巧(五)

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

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

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

  3. Linux Shell常用技巧(目录)

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

  4. Linux Shell常用技巧

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

  5. Linux Shell常用技巧(一) RE

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

  6. Linux Shell常用技巧(七)

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

  7. Linux Shell常用技巧(一)

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

  8. Linux Shell常用技巧(八)

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

  9. Linux Shell常用技巧(八) 系统运行状况

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

随机推荐

  1. P1928 外星密码

    题目描述 有了防护伞,并不能完全避免 2012 的灾难.地球防卫小队决定去求助外星种族的帮 助.经过很长时间的努力,小队终于收到了外星生命的回信.但是外星人发过来的却是一 串密码.只有解开密码,才能知 ...

  2. Turn Off Windows Firewall Using PowerShell and CMD

    If you want to turn off the Windows Firewall, there are three methods. One is using the GUI which is ...

  3. 使用dig进行DNS查询

    dig全称Domain Information Groper,是一个DNS域名信息查询的工具,可以使用来查看域名解析的过程. dig是linux下自带的工具,如果要在windows下使用需要自行下载和 ...

  4. KCF追踪方法流程原理

    读"J. F. Henriques, R. Caseiro, P. Martins, J. Batista, 'High-speed tracking with kernelized cor ...

  5. @Transactional 注解参数详解

    Transactional参数说明 参数名称 功能描述 readOnly 该属性用于设置当前事务是否为只读事务,设置为true表示只读,false则表示可读写,默认值为false.例如:@Transa ...

  6. Centos7 node npm升级版本

    安装npm 官网:https://nodejs.org/en/download/ 下载LTS Linux Binaries (x64)版本. # tar xf node-v10.16.3-linux- ...

  7. 2018-2019-2 20165234 《网络对抗技术》 Exp7 网络欺诈防范

    Exp7  网络欺诈防范 实验内容 1. 简单应用SET工具建立冒名网站 2. ettercap DNS spoof 3. 结合应用两种技术,用DNS spoof引导特定访问到冒名网站 4. 请勿使用 ...

  8. Linux make menuconfig打开失败

    OS:Ubuntu 16.04 LTS 使用“make menuconfig”配置kernel时,提示make menuconfig打开失败 $ make menuconfig *** Unable ...

  9. FM与FFM深入解析

    因子机的定义 机器学习中的建模问题可以归纳为从数据中学习一个函数,它将实值的特征向量映射到一个特定的集合中.例如,对于回归问题,集合 T 就是实数集 R,对于二分类问题,这个集合可以是{+1,-1}. ...

  10. 详谈mysqldump数据导出的问题

    1,使用mysqldump时报错(1064),这个是因为mysqldump版本太低与当前数据库版本不一致导致的. mysqldump: Couldn't execute 'SET OPTION SQL ...