I/O重定向
标准输出重定向
> :覆盖重定向,目标文件中的原有内容会被消除
>> :追加重定向,新内容会追加至目标文件尾部
set -C :禁止将内容覆盖输出到已有的文件中 <只在当前shell中有效>
若要强制覆盖可以使用 >| 例如 cat /etc/fstab >| /tmp/aa.txt
set +C:关闭以上功能
[root@Centos01 ~]# ls /var > /tmp/etc.out
[root@Centos01 ~]# ls /var/log/ >> /tmp/etc.out
标准错误重定向
[root@Centos01 ~]# cat /etc/issuee 2> /tmp/issue.txt
[root@Centos01 ~]# cat /tmp/issue.txt
cat: /etc/issuee: No such file or directory
[root@Centos01 ~]# cat /etc/issue 2> /tmp/issue.txt
CentOS release 6.5 (Final)
Kernel \r on an \m
[root@Centos01 ~]# cat /tmp/issue.txt 发现文件是空的,因为没有错误输出,所以2>只能重定向错误输出
2> :覆盖从定向错误输出
2>> :追加重定向错误输出
将标准输出和错误输出各自定向到不同位置:
[root@Centos01 ~]# tail -100 /etc/rc.d/rc.sysinit > /tmp/sysinit.out 2> /tmp/sysinit.err
[root@Centos01 ~]# cat /tmp/sysinit.err 这个文件是空的
[root@Centos01 ~]# cat /tmp/sysinit.out 这个文件是标准输出
[root@Centos01 ~]# tail -100 /etc/rc.d/rc.sysinidddt > /tmp/sysinit.out 2> /tmp/sysinit.err
[root@Centos01 ~]# cat /tmp/sysinit.err
tail: cannot open `/etc/rc.d/rc.sysinidddt' for reading: No such file or directory
可以合并标准输出和错误输出为同一个数据流进行重定向
&> 覆盖重定向
&>> 追加重定向
[root@Centos01 ~]# echo $PATH
/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
You have new mail in /var/spool/mail/root
[root@Centos01 ~]# echo $PATH &> /tmp/path.out
[root@Centos01 ~]# cat /tmp/path.out
/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
[root@Centos01 ~]#
[root@Centos01 ~]# echoooo $PATH &> /tmp/path.out
[root@Centos01 ~]# cat /tmp/path.out
-bash: echoooo: command not found
特殊写法:将标准输出和错误输出写到同一个文件可以使用2>&1
[root@Centos01 ~]# echo "$PATH" > /tmp/path.out 2>&1
[root@Centos01 ~]# echoddd "$PATH" >> /tmp/path.out 2>&1
[root@Centos01 ~]# cat /tmp/path.out
/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
-bash: echoddd: command not found
输入重定向:将原本需要有键盘输入的数据,同过文件来读入。 <
[root@Centos01 ~]# useradd jerry
[root@Centos01 ~]# vi pass.txt
[root@Centos01 ~]# passwd --stdin jerry < pass.txt
[root@Centos01 ~]# cat aa.txt
test stdin
使用cat命令在键盘上输入一些数据,然后写入catfile文件中
[root@Centos01 ~]# cat > catfile
testing
cat file tset
输入crtl+d结束
此时就会有catfile文件产生,而且该文件的内容就是刚刚输入的内容,那么是否可以使用其他文件来替换键盘输入呢
[root@Centos01 ~]# cat > catfile < aa.txt
[root@Centos01 ~]# cat catfile
test stdin
[root@Centos01 ~]#
我们可以用cat直接将输入的消息输出到catfile中,并且当输入EOF时,该次输入就结束,可以这样做
[root@Centos01 ~]# cat > catfile <<EOF
> this is a test testing
> ok now stop
> EOF
You have new mail in /var/spool/mail/root
[root@Centos01 ~]# cat catfile
this is a test testing
ok now stop
[root@Centos01 ~]#
[root@Centos01 ~]# tr abc ABC < /etc/fstab
#
# /etC/fstAB
# CreAted By AnACondA on Thu Jun 2 19:35:06 2016
#
# ACCessiBle filesystems, By referenCe, Are mAintAined under '/dev/disk'
# See mAn pAges fstAB(5), findfs(8), mount(8) And/or Blkid(8) for more info
#
/dev/mApper/vg_Centos01-lv_root / ext4 defAults 1 1
UUID=3BB70B22-A906-43eA-97d1-CA28485AfeC7 /Boot ext4 defAults 1 2
/dev/mApper/vg_Centos01-lv_home /home ext4 defAults 1 2
/dev/mApper/vg_Centos01-lv_swAp swAp swAp defAults 0 0
tmpfs /dev/shm tmpfs defAults 0 0
devpts /dev/pts devpts gid=5,mode=620 0 0
sysfs /sys sysfs defAults 0 0
proC /proC proC defAults 0 0
[root@Centos01 ~]# tr 'a-z' 'A-Z' < /etc/fstab
#
# /ETC/FSTAB
# CREATED BY ANACONDA ON THU JUN 2 19:35:06 2016
#
# ACCESSIBLE FILESYSTEMS, BY REFERENCE, ARE MAINTAINED UNDER '/DEV/DISK'
# SEE MAN PAGES FSTAB(5), FINDFS(8), MOUNT(8) AND/OR BLKID(8) FOR MORE INFO
#
/DEV/MAPPER/VG_CENTOS01-LV_ROOT / EXT4 DEFAULTS 1 1
UUID=3BB70B22-A906-43EA-97D1-CA28485AFEC7 /BOOT EXT4 DEFAULTS 1 2
/DEV/MAPPER/VG_CENTOS01-LV_HOME /HOME EXT4 DEFAULTS 1 2
/DEV/MAPPER/VG_CENTOS01-LV_SWAP SWAP SWAP DEFAULTS 0 0
TMPFS /DEV/SHM TMPFS DEFAULTS 0 0
DEVPTS /DEV/PTS DEVPTS GID=5,MODE=620 0 0
SYSFS /SYS SYSFS DEFAULTS 0 0
PROC /PROC PROC DEFAULTS 0 0
[root@Centos01 ~]# tr -d abc
alpha
lph
amnbak
mnk
此处生成文档
[root@Centos01 ~]# cat << EOF
> how are you?
> how old are you?
> EOF
how are you?
how old are you?
[root@Centos01 ~]# cat >> /tmp/test.out << EOF
> how are you?
> how old are you?
> EOF
[root@Centos01 ~]# cat /tmp/test.out
how are you?
how old are you?
利用<<右侧的控制符,可以终止一次输入,而不必输入ctrl+d来结束。这对程序的编写很有帮助。那么为什么要使用命令输出重定向呢?如果没有接触过脚本,这个问题一定会很难理解,下面是一些命令输出重定向的场合:
1. 当屏幕输出的信息很重要,而且我们需要将它存下来的时候
2. 后台执行的程序,不希望它干扰屏幕正常的输出结果
3. 一些系统的例行命令的执行结果,希望它可以存下来
4. 一些执行命令,我们已经知道它可能的错误消息,所以想以2>/dev/null将它丢掉
5. 错误消息与正确消息需要分别输出
大家都知道每个命令都有输入和输出,我们可不可以把前一个命令的输出当做后面命令的输入,大家都知道一个命令的输入可以从一个文件中读取,能不能从前一个命令中读取呢,这种机制就叫做管道,管道即把第一个命令的输出送给第二个命令当输入
[root@Centos01 ~]# echo $PATH
/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
[root@Centos01 ~]# echo $PATH | tr 'a-z' 'A-Z'
/USR/LIB64/QT-3.3/BIN:/USR/LOCAL/SBIN:/USR/LOCAL/BIN:/SBIN:/BIN:/USR/SBIN:/USR/BIN:/ROOT/BIN
[root@Centos01 ~]# echo $PATH | tr 'a-z' 'A-Z'| tr -d 'U'
/SR/LIB64/QT-3.3/BIN:/SR/LOCAL/SBIN:/SR/LOCAL/BIN:/SBIN:/BIN:/SR/SBIN:/SR/BIN:/ROOT/BINYou have
[root@Centos01 ~]# ls -al /etc | less 使用ls命令输出后的内容,就能够被less读取,并且利用less的功能,我们就能够前后翻动相关的信息,很方便
将登陆到系统上的用户信息中的后3行的信息转换为大写字母后保存至/tmp/who.out文件中
[root@Centos01 ~]# who | tail -n 3 | tr 'a-z' 'A-Z' > /tmp/who.out
将/etc/passwd/文件中的前5行内容转换为大写后保存至/tmp/passwd.out文件中
[root@Centos01 ~]# cat /etc/passwd | head -n 5 | tr 'a-z' 'A-Z' > /tmp/passwd.out
[root@Centos01 ~]# cat /tmp/passwd.out
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
脚本示例
1. 创建一个组newgroup,id号为4000
2. 创建一个用户test,id号为3001,附加组为newgroup
3. 创建目录/tmp/hellod
4. 复制/etc/fstab至上面的目录中
5. 改变目录及内部文件的属主和属组为test
6. 让目录及内部文件的其他用户没有任何权限
[root@Centos01 ~]# cat aa.sh
#!/bin/bash
groupadd -g 4000 newgroup
useradd -u 3001 -G newgroup test
mkdir /tmp/hellod
cp /etc/fstab /tmp/hellod
chown -R test:test /tmp/hellod
chmod -R o= /tmp/hellod
变量的命名要求
只能使用数字、字母、下划线组成
不能以数字开头
不能使用程序中关键字
要做到见名之意
awk可以处理后续文件,也可以读取来自前一个命令的标准输出。awk主要是处理“每一行字段内的数据”,而默认的字段分隔符为空格键或tab键,举例来说,用last可以将登录者的数据取出来,结果如图所示:
若想取出账号与登录者的IP地址,且账号与IP地址之间以tab键隔开,则会变成这样:
[root@Centos01 ~]# last | awk '{print $1 "\t" $3}'
root 192.168.1.100
root 192.168.1.100
reboot boot
root :0.0
root :0
awk是以行尾处理单位,而以字段为最小的处理单位
特殊变量:
$0;脚本名称自身
$?: 上一条命令的执行状态,状态用数字来表示:0-255 0表示成功,1-255表示失败
命令执行成功了,成功的标记叫状态返回值,而正常的命令执行后的结果叫返回值。bash 总结
原创
©著作权归作者所有:来自51CTO博客作者lyanhong的原创作品,谢绝转载,否则将追究法律责任
上一篇:子网划分
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
















