0222自学Linux_重定向+管道+glob+正则表达式+命令(tee,set,grep)

15

计算机五大部件:

运算器、控制器:CPU,存储器:RAM,输入设备\输出设备

0222自学Linux_重定向+管道+glob+正则表达式+命令(tee,set,grep)_第1张图片 

寄存器:CPU暂时存储器

I/O:硬盘

程序

INPUT设备

OUTPUT设备

 

系统设定(系统需要设定以下内容)

默认输出设备:标准输出,STDOUT1来表示

默认输入设备:标准输入,STDIN0来表示

标准错误输出:STDERR, 2来表示

 

输入设备:提供数据的,像硬盘鼠标,键盘,网卡

标准输入:键盘

标准输出和错误输出:显示器

 

I/O重定向:

我们用>来表示:输出重定向 :覆盖输出

>>附加,追加输出

我们用<来表示:输入重定向

[root@www ~]# ls -l /etc/passwd > /tmp/haha/1.txt 

[root@www ~]# cat /tmp/haha/1.txt

-rw-r--r--. 1 root root 1205 Aug 23 22:00 /etc/passwd

 

我们的Linux有很多开关

set来实现开和关某一些功能(这里说到这个set是因为假如有一个文档他里面内容很重要,你用了输出重定向覆盖了,那就很惨,所以可以设定用set定义开关来防止这种错误

help set查看这些命令

0222自学Linux_重定向+管道+glob+正则表达式+命令(tee,set,grep)_第2张图片 

      -C  If set, disallow existing regular files to be overwritten

          by redirection of output.

set -C:禁止对已经存在文件使用覆盖重定向

+C:关闭上述功能

如果要强制覆盖输出,则使用>|来实现否则就上图一样,不能够覆盖输出

 

记住:我们的Linux中,错误的输出和正确的输出是不同的数据流

我们要重定向错误输出,用2>;而2>>附加,追加错误输出

注意的是,2>2>>只能指向错误输出,不是错误输出的不理会

[root@www ~]# ls /varv/ 2> /tmp/haha/1.txt 

[root@www ~]# cat /tmp/haha/1.txt

ls: cannot access /varv/: No such file or directory

上图中是错误正确输出路径,如果输出的文件一样,就可以用&>

&>:重定向标准输出或者错误输出到同一个文件

但是不能使用&>>

 

输入重定向

我们命令查看文件的时候默认就带了给命令一个输入重定向的(但不是所有的都给了一个输入重定向,如tr命令

[root@www ~]# cat < /etc/fstab

# Created by anaconda on Fri Aug 21 19:26:07 2015

下面就是tr命令不能后面跟文件,但是可以输入重定向给tr

0222自学Linux_重定向+管道+glob+正则表达式+命令(tee,set,grep)_第3张图片 

<<Here Document此处生成文档(所以一般将一个文件输入重定向的话,谁不会用<<

[root@www var]# cat >> /home/linan/.bashrc << EOF

> alias cls=clear

> EOF

[root@www ~]# cat << END

> hello

> what is your name

END

hello

what is your name

以下这个例子:这种方式可以在脚本中生成一个文件的(下面可以看到,屏幕中就没有打印文档内容,而是直接写入了文档)

[root@www ~]# cat >> /tmp/haha/1.txt << EOF

> The firsh line.

> The second line.

> EOF

[root@www ~]# cat /tmp/haha/1.txt

The firsh line.

The second line.

所以这里如果想某一个文件输入东西就可以用cat >>可以不用echo

 

什么是管道(组合小命令,完成负责任务)

管道:前一个命令的输出,作为后一个命令的输入 ,并且可以以此类推

命令1 | 命令2 | 命令3 | ...

[root@www ~]# echo "linan" | passwd --stdin user1 

Changing password for user user1.

passwd: all authentication tokens updated successfully.

[root@www ~]# cut -d: -f3 /etc/passwd | sort -n

0

1

2

 

一、tee

tee - read from standard input and write to standard output and files

既能输出到屏幕一份,又能保存在文件中一份

 

可以输出到其他的终端,可以将输入的信息以文件的形式存储起来

[root@www ~]# wc -l /etc/passwd | cut -d' ' -f1 

26

 

[root@www var]# cat >> /home/linan/.bashrc << EOF

> alias cls=clear

> EOF

[root@www var]# cat /home/linan/.bashrc

alias cls=clear

 

 

16

一、grepegrepfgrep

文本查找文本检索的需要:

grepGlobal Research 

根据模式搜索文本,并将符合模式的“文本行显示出来。

模式pattern:文本字符和正则表达式元字符”组合而成的匹配条件

[root@www ~]# grep 'root' /etc/passwd

root:x:0:0:root:/root:/bin/bash

operator:x:11:0:operator:/root:/sbin/nologin

 

grep [options] PATTERN [file...] 

-i忽略大小写

--color显示的匹配的用颜色显示;可以在/etc/bashrc中加入alias

-v:显示没有被模式匹配到的行

-o:只显示被模式匹配到的字符串,其他不匹配的不显示

 

grep下的索引是正则表达式---注意跟我们之前的glob检索的*?不相同

正则表达式:Regular EXPressionREGEXP

我们之前讲到glob的时候有以下几个常用的

*:任意长度的任意字符

?:任意单个字符的

[]:表示匹配指定范围内的任意单个字符

[^]:表示不匹配指定范围外的任意单个字符

其中[][^]和正则表达式是一样的意思的,我们字符串都是写在[][^]里面的,如[[:digit:]]

grep的正则表达式表示的意思完全不一样,

正则表达式如下:

.:表示匹配任何单个字符的

*:匹配其前面的字符任意次

a*b,表示*前面的a可以任何多次,但是像acb是不可以的

\?:匹配其前面的字符1次或者0

.*:表示任意长度的任意字符,如a.*b表示,前面是a,后面是b,中间是啥都可以

[]:表示匹配指定范围内的任意单个字符

[^]:表示不匹配指定范围外的任意单个字符

[root@www ~]# grep '[[:digit:]]$' /etc/inittab   表示结尾是数字的

# multi-user.target: analogous to runlevel 3

# graphical.target: analogous to runlevel 5

 

匹配匹数(贪婪模式)

匹配个数:

有部分匹配,而不是全部匹配才会显示出来的,所以这个是grep的特性

grep本身的意思就是做部分匹配的

0222自学Linux_重定向+管道+glob+正则表达式+命令(tee,set,grep)_第4张图片 

另外指定次数的方法

花括号默认是命令行展开,所以下面这个\是转义字符来的。

以下看到\的都是转义字符,如\( 和\

\{m,n\}:匹配其前面的字符至少m次,至多n

grep a\{1,3\}’  test.txt 

表示匹配文件test.txta至少1次,至多3次的行

 

 

位置牟定

^:牟定行首,此字符后面的任何内容必须在行首

[root@www ~]# grep "^r..t" /etc/passwd

root:x:0:0:root:/root:/bin/bash

$:牟定行尾,此字符前面的任何内容必须在行尾

如以bash结尾的行bash$

^$:表示空白行

字符集合:

[:digit:] , [:lower:] , [:upper:] , [:punct:] , [:space:] , [:alpha:] ,[:alnum:]

这只是字符集合,所以如果我们要引用的时候,还得加多一个方括号,因为这是属于正则表达式[][^]内部的内容

[root@www ~]# grep '[[:digit:]]$' /etc/inittab 

#   5 - X11

 

匹配单词的一个grep的选项Linux中以字母开始,字母结尾的都是当做一个单词,如a55b,而ab不是,以为:是特殊字符

\<或者\b牟定词首,其后面的任意字符必须作为单词首部出现

\>或者\b牟定词尾,其前面的任意字符必须作为单词尾部出现

方便理解的话,就是大于小于号对着谁,就是对谁生效,像“root\>”这个大于号对着root就是说root必须作为单词尾部出现,当然用\b更好

\<root\> 就是表示root必须是个单词。

就是找一个单词中就是root

[root@www tmp]# grep "root\>" 1.t

root very administrator

mroot is a girl

 

最后一个元字符

分组:

\\

\(ab\)* ,这是分组,表示的是ab一个整体,也很好理解分组的意思,只要有ab的行就可以被匹配到

[root@www ~]# grep "\(ro\)." /etc/passwd

root:x:0:0:root:/root:/bin/bash

operator:x:11:0:operator:/root:/sbin/nologin

 

星号修饰的说前面任意字符的,说的就是ab一个整体

 

\1:第一个左括号以及与之对应的右括号所包括的所有内容,前面的是love,后面的\1引用前面的也就要是love

\2:

\3:

0222自学Linux_重定向+管道+glob+正则表达式+命令(tee,set,grep)_第5张图片


本文出自 “malinux学习” 博客,谢绝转载!

你可能感兴趣的:(grep,表达式,正则,管道)