I/O重定向 标准输出重定向 > :覆盖重定向,目标文件中的原有内容会被消除 >> :追加重定向,新内容会追加至目标文件尾部 set -C :禁止将内容覆盖输出到已有的文件中 <只在当前shell中有效> 若要强制覆盖可以使用 >| 例如 cat /etc/fstab >| /tmp/aa.txt set +C:关闭以上功能 [[email protected] ~]# ls /var > /tmp/etc.out [[email protected] ~]# ls /var/log/ >> /tmp/etc.out 标准错误重定向 [[email protected] ~]# cat /etc/issuee 2> /tmp/issue.txt [[email protected] ~]# cat /tmp/issue.txt cat: /etc/issuee: No such file or directory [[email protected] ~]# cat /etc/issue 2> /tmp/issue.txt CentOS release 6.5 (Final) Kernel \r on an \m [[email protected] ~]# cat /tmp/issue.txt 发现文件是空的,因为没有错误输出,所以2>只能重定向错误输出 2> :覆盖从定向错误输出 2>> :追加重定向错误输出 将标准输出和错误输出各自定向到不同位置: [[email protected] ~]# tail -100 /etc/rc.d/rc.sysinit > /tmp/sysinit.out 2> /tmp/sysinit.err [[email protected] ~]# cat /tmp/sysinit.err 这个文件是空的 [[email protected] ~]# cat /tmp/sysinit.out 这个文件是标准输出 [[email protected] ~]# tail -100 /etc/rc.d/rc.sysinidddt > /tmp/sysinit.out 2> /tmp/sysinit.err [[email protected] ~]# cat /tmp/sysinit.err tail: cannot open `/etc/rc.d/rc.sysinidddt‘ for reading: No such file or directory 可以合并标准输出和错误输出为同一个数据流进行重定向 &> 覆盖重定向 &>> 追加重定向 [[email protected] ~]# 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 [[email protected] ~]# echo $PATH &> /tmp/path.out [[email protected] ~]# cat /tmp/path.out /usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin [[email protected] ~]# [[email protected] ~]# echoooo $PATH &> /tmp/path.out [[email protected] ~]# cat /tmp/path.out -bash: echoooo: command not found 特殊写法:将标准输出和错误输出写到同一个文件可以使用2>&1 [[email protected] ~]# echo "$PATH" > /tmp/path.out 2>&1 [[email protected] ~]# echoddd "$PATH" >> /tmp/path.out 2>&1 [[email protected] ~]# 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 输入重定向:将原本需要有键盘输入的数据,同过文件来读入。 < [[email protected] ~]# useradd jerry [[email protected] ~]# vi pass.txt [[email protected] ~]# passwd --stdin jerry < pass.txt [[email protected] ~]# cat aa.txt test stdin 使用cat命令在键盘上输入一些数据,然后写入catfile文件中 [[email protected] ~]# cat > catfile testing cat file tset 输入crtl+d结束 此时就会有catfile文件产生,而且该文件的内容就是刚刚输入的内容,那么是否可以使用其他文件来替换键盘输入呢 [[email protected] ~]# cat > catfile < aa.txt [[email protected] ~]# cat catfile test stdin [[email protected] ~]# 我们可以用cat直接将输入的消息输出到catfile中,并且当输入EOF时,该次输入就结束,可以这样做 [[email protected] ~]# cat > catfile <<EOF > this is a test testing > ok now stop > EOF You have new mail in /var/spool/mail/root [[email protected] ~]# cat catfile this is a test testing ok now stop [[email protected] ~]# [[email protected] ~]# 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 [[email protected] ~]# 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 [[email protected] ~]# tr -d abc alpha lph amnbak mnk 此处生成文档 [[email protected] ~]# cat << EOF > how are you? > how old are you? > EOF how are you? how old are you? [[email protected] ~]# cat >> /tmp/test.out << EOF > how are you? > how old are you? > EOF [[email protected] ~]# cat /tmp/test.out how are you? how old are you? 利用<<右侧的控制符,可以终止一次输入,而不必输入ctrl+d来结束。这对程序的编写很有帮助。那么为什么要使用命令输出重定向呢?如果没有接触过脚本,这个问题一定会很难理解,下面是一些命令输出重定向的场合: 1. 当屏幕输出的信息很重要,而且我们需要将它存下来的时候 2. 后台执行的程序,不希望它干扰屏幕正常的输出结果 3. 一些系统的例行命令的执行结果,希望它可以存下来 4. 一些执行命令,我们已经知道它可能的错误消息,所以想以2>/dev/null将它丢掉 5. 错误消息与正确消息需要分别输出 大家都知道每个命令都有输入和输出,我们可不可以把前一个命令的输出当做后面命令的输入,大家都知道一个命令的输入可以从一个文件中读取,能不能从前一个命令中读取呢,这种机制就叫做管道,管道即把第一个命令的输出送给第二个命令当输入 [[email protected] ~]# echo $PATH /usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin [[email protected] ~]# 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 [[email protected] ~]# 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 [[email protected] ~]# ls -al /etc | less 使用ls命令输出后的内容,就能够被less读取,并且利用less的功能,我们就能够前后翻动相关的信息,很方便 将登陆到系统上的用户信息中的后3行的信息转换为大写字母后保存至/tmp/who.out文件中 [[email protected] ~]# who | tail -n 3 | tr ‘a-z‘ ‘A-Z‘ > /tmp/who.out 将/etc/passwd/文件中的前5行内容转换为大写后保存至/tmp/passwd.out文件中 [[email protected] ~]# cat /etc/passwd | head -n 5 | tr ‘a-z‘ ‘A-Z‘ > /tmp/passwd.out [[email protected] ~]# 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. 让目录及内部文件的其他用户没有任何权限 [[email protected] ~]# 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键隔开,则会变成这样: [[email protected] ~]# 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表示失败 命令执行成功了,成功的标记叫状态返回值,而正常的命令执行后的结果叫返回值。
时间: 2024-10-09 05:46:56