shell 一些常用的指令 (四)

六 、 字符展开

1 . less 一页一页地显示任何命令的输出

我们用 less 来一页一页地显示任何命令的输出,这极其方便!使用这项技术,我们可以方便地检测会产生标准输出的任一命令的运行结果。

ls -l /usr/bin | less

管道线经常用来对数据完成复杂的操作。有可能会把几个命令放在一起组成一个管道线。 通常,以这种方式使用的命令被称为过滤器。过滤器接受输入,以某种方式改变它,然后 输出它。第一个我们想试验的过滤器是 sort。想象一下,我们想把目录/bin 和/usr/bin 中 的可执行程序都联合在一起,再把它们排序,然后浏览执行结果:

ls /bin /usr/bin | sort | less
2 . uniq - 删除任何重复行

我们使用 uniq 从 sort 命令的输出结果中,来删除任何重复行。

ls /bin /usr/bin | sort | uniq | less

如果我们想看到 重复的数据列表,让 uniq 命令带上”-d”选项,就像这样

ls /bin /usr/bin | sort | uniq -d | less
3 . wc - 打印行数、字数和字节数

wc(字计数)命令是用来显示文件所包含的行数、字数和字节数。例如:

wc ls-output.txt

这里写图片描述

”-l”选项限制命令输出只能 报道行数。添加 wc 到管道线来统计数据,是个很便利的方法。查看我们的有序列表中程序个数, 我们可以这样做

ls /bin /usr/bin | sort |uniq | wc -l

这里写图片描述

4 . grep - 打印匹配行

grep 是个很强大的程序,用来找到文件中的匹配文本。这样使用 grep 命令

grep pattern [file.....]

这里写图片描述

当 grep 遇到一个文件中的匹配”模式”,它会打印出包含这个类型的行

比如说,我们想在我们的程序列表中,找到文件名中包含单词”zip”的所有文件。这样一个搜索, 可能让我们了解系统中的一些程序与文件压缩有关系。这样做:

ls /bin /usr/bin | sort | uniq | grep zip

这里写图片描述

grep 有一些方便的选项:”-i”使得 grep 在执行搜索时忽略大小写(通常,搜索是大小写 敏感的),”-v”选项会告诉 grep 只打印不匹配的行。以下例子是在text.txt文本中查找含有e的行,不区分大小写:

grep -i e text.txt

这里写图片描述

5 . head / tail - 打印文件开头部分/结尾部分
  • head
    head 命令打印文件的前十行,而 tail 命令打印文件的后十行。默认情况下,两个命令 都打印十行文本,但是可以通过”-n”选项来调整命令打印的行数。

    head -n 5 text.txt
    head -n 10 text.txt
    head text.txt

    这里写图片描述

    用在管道线中

    ls /usr/bin | tail -n 5

    使用”-f”选项,tail 命令继续监测这个文件,当新的内容添加到文件后,它们会立即 出现在屏幕上。这会一直继续下去直到你输入 Ctrl-c。

    tail -f /var/log/messages
6 . tee

Linux 提供了一个叫做 tee 的命令,这个命令制造了 一个”tee”,安装到我们的管道上。这里,我们重复执行一个先前的例子, 这次包含 tee 命令,在 grep 过滤管道线的内容之前,来捕捉整个目录列表到文件 ls.txt:


ls /usr/bin | tee ls.txt | grep zip

7 . 字符展开 echo
echo *

shell 在 echo 命 令被执行前把”“展开成了另外的东西(在这里,就是在当前工作目录下的文件名字)。 当回车键被按下时,shell 在命令被执行前在命令行上自动展开任何符合条件的字符, 所以 echo 命令的实际参数并不是”“,而是它展开后的结果。 通配符所依赖的工作机制叫做路径名展开。
这里写图片描述

查看家目录之外的目录:

echo /usr/*/share

以下输出命令,不会显示隐藏文件,

echo *

如果展开模式以一个圆点开头,我们就能够在展开中包含隐藏文件, 就像这样

echo .*

这里写图片描述

它几乎要起作用了。然而,如果我们仔细检查一下输出结果,我们会看到名字”.” 和”..”也出现在结果中。由于它们是指当前工作目录和父目录,使用这种 模式可能会产生不正确的结果。我们可以通过这个命令来验证:

ls -d .* | less

为了在这种情况下正确地完成路径名展开,我们应该使用一个更精确的模式。 这个模式会正确地工作:

ls -d .[!.]?*

这种模式展开成所有以圆点开头,第二个字符不包含圆点,再包含至少一个字符, 并且这个字符之后紧接着任意多个字符的文件名。这个命令将正确列出大多数的隐藏文件 (但仍不能包含以多个圆点开头的文件名)。带有 -A 选项(“几乎所有”)的 ls 命令能够提供一份正确的隐藏文件清单:

ls -A
8 . 算术表达式展开

shell 在展开中执行算数表达式。这允许我们把 shell 提示当作计算器来使用:

echo $((2+2))

算术表达式只支持整数(全部是数字,不带小数点),但是能执行很多不同的操作。这里是 一些它支持的操作符:
添加图片

在算术表达式中空格并不重要,并且表达式可以嵌套。例如,5的平方乘以3:

echo $(((5**2)*3))

这里写图片描述

9 . 花括号展开

通过它,你可以从一个包含花括号的模式中 创建多个文本字符串。这是一个例子,就是从花括号中任选一个,组成文本字符串:

echo Front-{A,B,C}-Back

这里写图片描述
花括号展开模式可能包含一个开头部分叫做报头,一个结尾部分叫做附言。花括号表达式本身可 能包含一个由逗号分开的字符串列表,或者一系列的整数,下边的点必须是2个,不能是3个,3个不对,这种模式不能 嵌入空白字符。这个例题使用了一系列整数:

echo Number_{1..5}

这里写图片描述
一系列以倒序排列的字母:

echo {Z..A}

这里写图片描述
花括号展开可以嵌套:

echo a{A{1,2},B{3,4}}b

这里写图片描述
要创建一系列以数值”年-月”形式命名的目录。可以使目录名按照 年代顺序排列。

mkdir Pics
cd Pics
mkdir {2007..2009}-0{1..9} {2007..2009}-{10..12}
ls
2007-01 2007-07 2008-01 2008-07 2009-01 2009-07
2007-02 2007-08 2008-02 2008-08 2009-02 2009-08
2007-03 2007-09 2008-03 2008-09 2009-03 2009-09
2007-04 2007-10 2008-04 2008-10 2009-04 2009-10
2007-05 2007-11 2008-05 2008-11 2009-05 2009-11
2007-06 2007-12 2008-06 2008-12 2009-06 2009-12

这里写图片描述
输出变量,$加变量名

echo $USER

要查看有效的变量列表,可以试试这个:

printenv | less

你可能注意到在其它展开类型中,如果你误输入一个模式,展开就不会发生。这时 echo 命令只简单地显示误键入的模式。但在参数展开中,如果你拼写错了一个变量名, 展开仍然会进行,只是展开的结果是一个空字符串:

bash 也支持这种语法。它使用倒引号来代替美元符号和括号:

ls -l `which cp`
ls -l $(whic cp)
10 . 引用
echo this is a   test
echo The total is $100.00

这里写图片描述

在第一个例子中,shell 利用单词分割删除掉 echo 命令的参数列表中多余的空格。在第二个例子中, 参数展开把 $1 的值替换为一个空字符串,因为 1 是没有定义的变量。shell 提供了一种 叫做引用的机制,来有选择地禁止不需要的展开。

在默认情况下,单词分割机制会在单词中寻找空格,制表符,和换行符,并把它们看作 单词之间的界定符。这意味着无引用的空格,制表符和换行符都不是文本的一部分, 它们只作为分隔符使用。由于它们把单词分为不同的参数,所以在上面的例子中, 命令行包含一个带有四个不同参数的命令。如果我们加上双引号:

echo "this is a    test"

这里写图片描述

这里写图片描述

11 . 单引号

如果需要禁止所有的展开,我们要使用单引号。以下例子是无引用,双引号,和单引号的比较结果:

echo text ~/*.txt {a,b} $(echo foo) $((2+2)) $USER
echo "text ~/*.txt {a,b} $(echo foo) $((2+2)) $USER"
echo 'text ~/*.txt {a,b} $(echo foo) $((2+2)) $USER'
12 . 转义字符

有时候我们只想引用单个字符。我们可以在字符之前加上一个反斜杠,在这里叫做转义字符。 经常在双引号中使用转义字符,来有选择地阻止展开。

echo "The balance for user $USER is : \$5.00"

这里写图片描述
为了允许反斜杠字符出现,输入”\“来转义。注意在单引号中,反斜杠失去它的特殊含义,它 被看作普通字符。

这里写图片描述

我们可以使用 sleep 命令创建一个简单的倒数计数器( sleep 是一个简单的程序, 它会等待指定的秒数:

sleep 10;echo -e "Time's up\a"
sleep 10; echo "Time's up" $'\a'

这里写图片描述

参考链接: http://billie66.github.io/TLCL/book/chap08.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lancnn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值