且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

IO重定向&管道&元字符

更新时间:2022-08-23 11:06:28

一、glob及IO重定向

bash基础特性:命令补全,路径补全,命令引用

1.bash的其他特性

globbing:文件名统配

动态角度:运行中的内核,在内核之上,由内核支配负责管控的文件系统

静态:内核自己其实也是文件系统上的一个文件而已

2.元字符

匹配模式:元字符:

*:匹配任意长度的任意字符

*pa* 包含pa

pa*  pa开头

*pa pa结尾,

?:匹配任意单个字符

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

有几种特殊格式:

[a-z],[A-Z],[0-9],[a-z0-9]

[abcxyz] //有一个

//指定范围的时候,是不区分文件名大小写

ls 进行测试命令

[[:upper:]] 所有大写字母

[[:lower:]] 所有小写字母

[[:alpha:]] 所有字母

[[:digit:]] 所有数字

[[:alnum:]] 所有的字母和数字

[[:space:]] 所有空白字符

[[:punct:]] 所有标点字符

! 取反

touch a\ b //创建a b包含特殊字符,空格

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

[^[:upper:]] //非大写

[^0-9] 非数字

ls -d /tmp/test 匹配目录和文件,而不是目录的内容

ls -d /etc/n*[^0-9] //匹配都的文件和目录都会显示

-d 文件或者目录

*,?,[],!,^

ls -d

3.IO重定向及管道

程序:指令+数据

程序也有IO

可用输入的设备:文件

键盘设备、文件系统上的常规文件、网卡等

可用的输出设备:文件

显示器、文件系统上的常规文件、网卡等

程序的数据流有三种:

输入数据流:< -- 标准输入(stdin)

默认的额标准输入时键盘

输出的数据流:-->标准输出(stdout),显示器

错误输出数据流:--->标准输出(stderr),显示器

fd:filedescriptor,文件描述符

标准输入:0

标准输出:1

错误输出:2

IO重定向

输出重定向:>

cat /etc/issue > /dev/tty1  //直接输出到该用户界面

echo ,ls 也可以实现,追加到设备

cat /etc/issue > /dev/sda //直接就会损坏硬盘

特性:

覆盖输出

输出重定向:>>

特性:追加输出

4.IO重定向相关命令

    特别危险,于是建议使用set

set:设置和撤销,shell选项的值和位置选项

type set:bash的内建命令

-C 禁止通过输出重定向,覆盖一个已经存在的文件

//不存在的文件,覆盖是可以的,追加已经存在的文件也是可以的

set -C 启用该功能

echo "hhh" > /tmp/a   //出错,条件a已经存在

echo "hhh" >> /tmp/a  //可以追加

//假如只想覆盖一次,可以强制覆盖输出

cat /etc/issue >| /tmp/a    

set +C //关闭该特性

set -C //仅对当前shell起作用

5.错误输出流重定向

2> 错误覆盖输出重定向  only

2>> 错误追加输出重定向  only

合并正确和错误输出流

&> 

&>>

COMMAND > /path/to/somefile 2>&1 合并为正确的,覆盖

COMMAND >> /path/to/somefile 2>>&1 合并为正确的,追加

1> 标准信息输出路径 //ls /home 1> aa 覆盖到aa,和

//一般1> 可以省略不写

2> 错误信息输出路径

2>&1 错误和正确的都输出到

&是与的意思

正确输出和错误输出的转换

cat /etc/rc.d/init.d/function >> /tmp/aa 2>&1

function 是不存在的

如果是正常的:输出到aa中 // >> 只接受正确的

如果是错误的,转换为正确的的输出,然后追加到aa // 2>只接受错误的

6.输入重定向

cat < /etc/fstab //和cat /etc/fstab 一样

cat

tr [OPTION]...  SET1 [SET2]

把输入的数据当中的字符,凡是在SET1定义范围内出现的,

tr [a-z] [A-Z]

//把出现在第一个集合中的字符,对位转换为对应字符

tr [a-z] [A-Z] < /etc/issue 

tr -d '[A-Z]'  < /etc/issue 

tr -d ‘[[:upper:]] <  /etc/issue

tr -d 'abc' < /etc/issue 

-d 删除 //只是输出到屏幕不显示而已

<< :两个小于号,Here Document

cat <<  EOF //打包输出

cat > /tmp/a.out <<  END //输入重定向,创建文件

7.管道

连接程序,将前一个命令的输出直接定向后一个程序当做输入

COMMAND | COMMAND | COMMAND | ...

cat /etc/issue | tr 'a-z' 'A-Z'

cat自己的输出将不可见,因为他把结果交给了tr

解决方法:

tee:读取标准输入,写到标准输出以及文件

cat /etc/issue | tee  a.tee | tr 'a-z' 'A-Z'

tee 将数据流,

一份:保存到a.tee中

一份:送给tr

8.小结:

元字符:*,?,[],^,!,\转义

ls -d

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

IO重定向:

程序的数据流:

标准输入流:0:stdin

标准输出流:1:stout

错误输出流:2:sterr

echo “hello world ” 》》 /dev/pts/1

重定向:

输出重定向:>  >>

输入重定向:<  << 

错误输出重定向:2>  2>>

建议使用set

set -C //禁止通过输出重定向覆盖一个已经存在的文件

>| 强制覆盖一次

set +C

合并正确和错误输出流

&> 

&>>

COMMAND > /path/to/somefile 2>&1 合并为正确的,覆盖

COMMAND >> /path/to/somefile 2>>&1 合并为正确的,追加

tr [a-z] [A-Z] < /etc/issue 

cat > /tmp/a.out <<  END //输入重定向,创建文件

cat /etc/issue | tee  a.tee | tr 'a-z' 'A-Z'

tee 将数据流,

一份:保存到a.tee中

一份:送给tr

重点:

1.合并输出重定向

2>&1 和&>是一样的,2>>&1,&>>

2.cat和set

cat << /etc/fstab

cat > /tmp/a.out <<  END //输入重定向,创建文件

3.stat 展示文件或者文件系统的状态


    bash globbing,IO重定向及管道

glob:*,?,[],[^]

    IO重定向:

        >,>> 正确的输出

2>,2>> 错误输出

&>,&>> 混合重定向

> /PATH/to/somefile 2>&1

<  <<(here Document)

命令:tr ,tee

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
tee:读取标准输入的数据,并将其内容输出成文件。
    -a或--append  附加到既有文件的后面,而非覆盖它.
    -i或--ignore-interrupts 忽略中断信号
    who | tee who.out
tr:它可以用一个字符来替换另一个字符
    带有最常用选项的tr命令格式为:
    tr -c -d -s ["string1_to_translate_from"] ["string2_to_translate_to"] < input-file
    -c 用字符串1中字符集的补集替换此字符集,要求字符集为ASCII。
    -d 删除字符串1中所有输入字符。
    -s 删除所有重复出现字符序列,只保留第一个;即将重复出现字符串压缩为一个字符串。
    input-file是转换文件名。虽然可以使用其他格式输入,但这种格式最常用。
2、字符范围
    指定字符串1或字符串2的内容时,只能使用单字符或字符串范围或列表。
    [a-z] a-z内的字符组成的字符串。
    [A-Z] A-Z内的字符组成的字符串。
    [0-9] 数字串。
    \octal 一个三位的八进制数,对应有效的ASCII字符。
    [O*n] 表示字符O重复出现指定次数n。因此[O*2]匹配OO的字符串。
tr中特定控制字符的不同表达方式
    速记符含义八进制方式
    \a Ctrl-G  铃声\007
    \b Ctrl-H  退格符\010
    \f Ctrl-L  走行换页\014
    \n Ctrl-J  新行\012
    \r Ctrl-M  回车\015
    \t Ctrl-I  tab键\011
    \v Ctrl-X  \030
实例:
1、将文件file中出现的"abc"替换为"xyz"
    # cat file | tr "abc" "xyz" > new_file
  
【注意】这里,凡是在file中出现的"a"字母,都替换成"x"字母,"b"字母替换为"y"字母,"c"字母替换为"z"字母。而不是将字符串"abc"替换为字符串"xyz"。
  
2、使用tr命令“统一”字母大小写
    (小写 --> 大写)
    # cat file | tr [a-z] [A-Z] > new_file
    (大写 --> 小写)
    # cat file | tr [A-Z] [a-z] > new_file
  
3、把文件中的数字0-9替换为a-j
    # cat file | tr [0-9] [a-j] > new_file
 
4、删除文件file中出现的"Snail"字符
    # cat file | tr -d "Snail" > new_file
    【注意】这里,凡是在file文件中出现的'S','n','a','i','l'字符都会被删除!而不是紧紧删除出现的"Snail”字符串。
  
5、删除文件file中出现的换行'\n'、制表'\t'字符
    # cat file | tr -d "\n\t" > new_file
    不可见字符都得用转义字符来表示的,这个都是统一的。
  
6、删除“连续着的”重复字母,只保留第一个    
    # cat file | tr -s [a-zA-Z] > new_file
  
7、删除空行
    # cat file | tr -s "\n" > new_file
 
8、删除Windows文件“造成”的'^M'字符
    # cat file | tr -d "\r" > new_file
    或者# cat file | tr -s "\r" "\n" > new_file
   【注意】这里-s后面是两个参数"\r"和"\n",用后者替换前者
  
9、用空格符\040替换制表符\011
    # cat file | tr -s "\011" "\040" > new_file
  
10、把路径变量中的冒号":",替换成换行符"\n"
    # echo $PATH | tr -s ":" "\n
本文转自MT_IT51CTO博客,原文链接:http://blog.51cto.com/hmtk520/1941762,如需转载请自行联系原作者