一、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
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"