拿小本本记下的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. TensorFlow(十七):训练自己的图片分类模型

    (一)下载inception-v3--见TensorFlow(十四) (二)准备训练用的图片集,因为我没有图片集,所以写了个自动抓取百度图片的脚本-见抓取百度图片 (三)创建retrain.py文件, ...

  2. WPS-系统缺失字体

    WPS-系统缺失字体 小书匠 linux  在Linux上新安装WPS后,第一次打开就出现以下问题: wps系统缺失字体 问题原因: Linux上缺少windows字体,把字体添加上去即可. 操作步骤 ...

  3. shell wait 和sleep 对比

    wait 在 shell 中使用 wait 是在等待上一批或上一个脚本执行完(即上一个的进程终止),再执行wait之后的命令. sleep sleep 1 睡眠1秒 sleep 1s 睡眠1秒 sle ...

  4. 小程序can't read property 'push' of undefined

    在某些情况下是因为没有初始化,所以初始化一下就好了

  5. 十一月百度杯pwnme 详细wp

    目录 程序基本信息 程序溢出点 整体思路 exp脚本 成功获得flag 参考 程序基本信息 可以看到开启了栈不可执行和got表不可写保护. 程序溢出点 在函数sub_400AF7中,v8可以读入0x1 ...

  6. legend3---lamp.sh常用操作

    legend3---lamp.sh常用操作 一.总结 一句话总结: 1.github上下载代码 2.修改项目数据库配置,修改文件权限等操作:chown -R apache:apache /data/w ...

  7. These dependencies were not found: *!!vue-style-loader!css-loader?

    在vue中使用less首先要下载依赖:npm install less less-loader --save-dev 下载好之后就可以.vue文件中使用lang="less"和@i ...

  8. 创建Bitmap之BitmapFactory

    package com.loaderman.customviewdemo; import android.app.Activity; import android.graphics.Bitmap; i ...

  9. OpenNebula概述

    OpenNebula概述 OpenNebula是专门为云计算打造的开源系统,用户可以使用Xen.KVM.VMware等虚拟化软件一起打造企业云.利用OpenNebula可以轻松构建私有云.混合云.公开 ...

  10. Access-Control-Max-Age是什么?

    Access-Control-Max-Age是什么   答: 浏览器的同源策略,就是出于安全考虑,浏览器会限制从脚本发起的跨域HTTP请求(比如异步请求GET, POST, PUT, DELETE, ...