Linux Shell(bash) 重定向技巧
- 格式:doc
- 大小:35.00 KB
- 文档页数:4
shell常⽤重定向实例讲解每个打开的⽂件都会被分配⼀个⽂件描述符.stdin (键盘), stdout (屏幕), 和 stderr (错误消息输出到屏幕上)的⽂件描述符分别是0, 1, 和 2. 对于正在打开的额外⽂件, 保留了描述符3到9.⽂件描述符是⽂件系统为了跟踪这个打开的⽂件⽽分配给它的⼀个数字。
下⾯以实例说明1,>的⽤法复制代码代码如下:[zhangy@localhost ~]$ echo "11111" > 1.txt[zhangy@localhost ~]$ cat 1.txt11111[zhangy@localhost ~]$ echo "11111" 1> 1.txt //这个⽤法和上⾯的⽤法是⼀样[zhangy@localhost ~]$ cat 1.txt11111[zhangy@localhost ~]$ echo "22222" >1.txt[zhangy@localhost ~]$ cat 1.txt22222这种⽤法我想⼤家都⾮常的熟悉,因为这是我经常会⽤到的。
echo "11111" > 1.txt 时,>前⾯是有⼀个1的,是默认的。
>重定向到⽂件时,会将⽂件清空,在写⼊。
复制代码代码如下:[zhangy@localhost ~]$ > 1.txt[zhangy@localhost ~]$ :> 1.txt上⾯的这个例⼦,可以把1.txt⽂件中的内容清空,其实也很好理解,清空后,不输⼊内容当然为空了。
2,>>的⽤法复制代码代码如下:[zhangy@localhost ~]$ echo "2222" >> 2.txt[zhangy@localhost ~]$ cat 2.txt2222[zhangy@localhost ~]$ echo "2222" >> 2.txt[zhangy@localhost ~]$ cat 2.txt22222222从上⾯的这个例⼦我们可以看出,>>重定向到⽂件时,会将输出写到⽂件的结尾。
linux的标准输入重定向例子
标准输入重定向是将命令的输入从键盘转向其他来源,例如文件或其他命令的输出。
以下是Linux中的标准输入重定向的几个例子:
1. 从文件中读取输入:
```shell
$ command < file.txt
```
这个命令将会将`file.txt`的内容作为`command`命令的输入。
2. 通过管道将命令的输出作为输入:
```shell
$ command1 | command2
```
这个命令将会将`command1`的输出作为`command2`的输入。
3. 结合使用管道和重定向:
```shell
$ command1 | command2 < file.txt
```
这个命令将会将`command1`的输出作为`command2`的输入,而且`command2`的输入还会从
`file.txt`中读取。
4. 使用here文档:
```shell
$ command <<EOF
> input text
> input text
> more input text
> EOF
```
这个命令将会将`input text`作为输入传递给`command`命令。
`<<EOF`表示输入将从当前行延续到文件结尾的`EOF`行。
这些例子展示了如何使用标准输入重定向来改变命令的输入来源。
请注意,标准输入重定向使用`<`符号来指定重定向来源。
linuxshell之终端读写⽂件数据流和重定向,,《,》终端实现⽂件中数据流的读写;重定向命令列表如下:命令说明command > file将输出重定向到 file。
将终端数据写到⽂件file中command < file将输⼊重定向到 file。
将⽂件command >> file将输出以追加的⽅式重定向到 file。
n > file将⽂件描述符为 n 的⽂件重定向到 file。
n >> file将⽂件描述符为 n 的⽂件以追加的⽅式重定向到 file。
n >& m将输出⽂件 m 和 n 合并。
n <& m将输⼊⽂件 m 和 n 合并。
<< tag将开始标记 tag 和结束标记 tag 之间的内容作为输⼊。
需要注意的是⽂件描述符 0 通常是标准输⼊(STDIN),1 是标准输出(STDOUT),2 是标准错误输出(STDERR)。
这⾥可以⽤于⽇志打印到⽂件;输出重定向重定向⼀般通过在命令间插⼊特定的符号来实现。
特别的,这些符号的语法如下所⽰:command1 > file1上⾯这个命令执⾏command1然后将输出的内容存⼊file1。
注意任何file1内的已经存在的内容将被新内容替代。
如果要将新内容添加在⽂件末尾,请使⽤>>操作符。
实例执⾏下⾯的 who 命令,它将命令的完整的输出重定向在⽤户⽂件中(users):$ who > users执⾏后,并没有在终端输出信息,这是因为输出已被从默认的标准输出设备(终端)重定向到指定的⽂件。
你可以使⽤ cat 命令查看⽂件内容:$ cat users_mbsetupuser console Oct 31 17:35tianqixin console Oct 31 17:35tianqixin ttys000 Dec 1 11:33输出重定向会覆盖⽂件内容,请看下⾯的例⼦:$ echo "菜鸟教程:" > users$ cat users菜鸟教程:$如果不希望⽂件内容被覆盖,可以使⽤ >> 追加到⽂件末尾,例如:$ echo "菜鸟教程:" >> users$ cat users菜鸟教程:菜鸟教程:$输⼊重定向和输出重定向⼀样,Unix 命令也可以从⽂件获取输⼊,语法为:command1 < file1这样,本来需要从键盘获取输⼊的命令会转移到⽂件读取内容。
Shell脚本中的日志记录和日志分析技巧在Shell脚本编程中,日志记录和日志分析是非常重要的一部分。
通过记录和分析日志,可以方便开发人员进行错误排查、性能优化和系统监控。
本文将介绍一些Shell脚本中常用的日志记录和分析技巧。
一、日志记录在Shell脚本中,可以使用echo命令将输出信息打印到屏幕上。
然而,如果需要将重要的输出信息记录到日志文件中,可以通过重定向将echo的输出写入到文件中。
1.创建日志文件在Shell脚本中,可以使用touch命令创建一个新的日志文件。
例如:```#!/bin/bashLOG_FILE="/var/log/my_script.log"touch $LOG_FILE```2.记录日志在Shell脚本中,可以使用重定向符号(>>)将输出信息追加到日志文件中。
例如:```#!/bin/bashLOG_FILE="/var/log/my_script.log"echo "Start script" >> $LOG_FILEecho "Doing something..." >> $LOG_FILEecho "Script completed" >> $LOG_FILE```以上代码会将"Start script"、"Doing something..."和"Script completed"这三行文本追加到日志文件中。
二、日志分析日志分析是指对日志文件中的内容进行统计和分析,以便获取有用的信息。
下面介绍两种常见的日志分析技巧:关键字搜索和日志分析工具的使用。
1.关键字搜索在Shell脚本中,可以使用grep命令对日志文件进行关键字搜索。
grep命令可以根据指定的关键字过滤出包含该关键字的行。
bash 教程Bash是一个常用的Shell脚本语言,被广泛用于Linux和Unix 系统中。
它是Bourne Shell的改进版,具有更多的功能和更强大的功能。
Bash的优势之一是其简洁性和易用性。
Bash脚本由一系列命令构成,通过这些命令和操作符可以完成各种任务。
它可以用于编写脚本程序,实现自动化任务和批量处理。
Bash脚本以文本文件形式保存,并以`.sh`为文件扩展名。
可以使用文本编辑器创建和编辑Bash脚本。
在Linux系统中,可以使用`vi`或`nano`等编辑器来进行编辑。
Bash脚本中的命令可以是系统命令、自定义命令或其他脚本文件。
脚本文件以`#!/bin/bash`作为开头,这是告诉系统使用Bash解释器来运行脚本的命令。
Bash脚本具有以下特性:1. 变量:可以使用变量来存储和操作数据。
Bash脚本中的变量以`$`符号开头,没有数据类型的限制。
可以通过赋值来创建变量,并在脚本中使用它们。
2. 条件语句:可以使用if语句来进行条件判断和分支控制。
根据条件的结果,可以执行不同的命令或操作。
3. 循环:可以使用不同类型的循环,如for循环、while循环和until循环。
循环可用于重复执行相同的命令或操作。
4. 输入输出重定向:可以使用输入输出重定向来控制命令的输入和输出。
例如,可以将命令的输出保存到文件中,或从文件中读取输入。
5. 函数:可以定义和使用函数来封装和重用一部分代码。
函数可以传递参数,并返回结果。
Bash脚本还支持各种其他功能,如字符串操作、数组、文件和目录处理、正则表达式等。
可以使用这些功能来完成复杂的任务。
总而言之,Bash是一种强大而灵活的Shell脚本语言,通过编写Bash脚本,可以实现各种自动化任务和系统管理操作。
使用Bash脚本,可以提高工作效率,并减少重复性的工作。
它是Linux和Unix系统中不可或缺的一部分。
Linux之重定向1,Linux中的重定向到底是个什么呢?Linux中的重定向就是将原本要输出到屏幕中的数据信息,重新指向某个特定的⽂件中,或者定向到⿊洞(/dev/null)中。
1.2重定向有什么⽤呢?1,当程序执⾏输出的信息⽐较多时,需要保存下来在进⾏分页查看。
2,后台执⾏的程序⼀般都会有输出,不希望它输出⼲扰到终端。
3,执⾏定时的备份任务,希望备份的结果保留下来时。
4,当重复创建⽤户,会提⽰⼀些错误信息,可以直接将信息丢弃。
5,希望将错误⽇志与正确⽇志,分别输出保存到不同⽂件时。
1.3 标准输⼊与输出当进程操作⼀个⽂件时:1,⾸先进程是⽆法直接访问硬件的,需要借助内核来访问⽂件2,⽽内核kernel需要利⽤⽂件描述符(file descriptor)来访问⽂件。
总结:进程---通过--->⽂件描述符(⾮负整数)--访问---》⽂件名称;进程使⽤⽂件描述符来管理打开的⽂件对应关系。
第⼀步:运⾏ tail -f /etc/passwd第⼆部:通过⽂件描述符3--->/etc/passwd-->inode-->block第三步:正确输出--->默认情况下通过⽂件描述符1--->当前终端 1>(改变输出的位置,⽂件,⿊洞)第四步:错误输出--->默认情况下通过⽂件描述符2---》当前终端 2>(错误输出)通常程序访问⼀个⽂件⾄少会打开三个标准⽂件,分别是标准输⼊,标准输出,错误输出。
进程将从标准输⼊中得到数据,将正常输出打印⾄屏幕终端,将错误的输出信息也打印⾄屏幕终端。
名称⽂件描述符作⽤标准输⼊(STDIN)0默认是键盘,也可以是⽂件或其他命令的输出标准输出(STDOUT)1默认输出到屏幕。
错误输出(STDERR)2默认输出到屏幕⽂件名称(filename)3+2,输出重定向案例输出重定向,改变输出内容的位置。
输出重定向有如下⼏种⽅式,如表格所⽰:类型操作符⽤途标准覆盖输出重定向1>将程序输出的正确结果输出到指定到⽂件中,会覆盖⽂件原有的内容标准追加输出重定向1>>将程序输出的正确结果以追加的⽅式输出到指定⽂件错误覆盖输出重定向2>将程序的错误结果输出到执⾏的⽂件中,会覆盖⽂件原有的内容错误追加输出重定向2>>将程序输出的错误结果以追加的⽅式输出到执⾏的⽂件2.1,案例1,-标准输出重定向标准输出重定向⽰例1,如果⽂件不存在则创建2,如果⽂件存在则清空内容[root@: ~]#> text.txt[root@: ~]#ifconfig echo > edu.txt2.2案例-标准追加输出重定向标准追加输出重定向⽰例1,如果⽂件不存在则创建2,如果⽂件存在则在⽂件尾部添加内容[root@: ~]#echo "hello linux" >>if2.3案例3-错误输出重定向错误输出重定向1,正确输出及错误输出⾄相同⽂件2,正确输出及错误输出⾄不同的⽂件[root@: ~]#find /etc -name "*.conf" 1>ok 2>ok[root@: ~]#find /etc -name "*.conf" 1>ok 2>error2.4案例4-混合和输出重定向混合输出重定向1,将正确输出和错误输出混合⾄同⼀⽂件2,将两个⽂件内容组合为⼀个⽂件[root@: ~]#find /etc/ -name "*.conf" &>ab[root@: ~]#cat ab >c*正确和错误都输⼊到相同位置[root@: ~]#ls /root/ /error >ab 2>&12.5,案例5-将内容输出⾄⿊洞[root@: ~]#ls /root/ /error >ab 2>/dev/null[root@: ~]#ls /root/ /error >ab &>/dev/null3,输⼊重定向案例输⼊重定向:指的是"重新指定设备"来"代替键盘"作为新的输⼊设备;3.1输⼊重定向⽰例1,通过输⼊重定向读取⽂件内容;[root@: ~]#cat < /etc/hosts2,通过输⼊重定向读⼊多⾏内容;[root@: ~]# cat <<EOF[root@: ~]#cat <<EOF> 1> 2> 3> 4> 5> EOF #只要不出现EOF则可以⼀直输⼊3,通过输⼊重定向数据导⼊⾄数据库中;[root@: ~]#mysql -uroot -p < /opt/wordpress.sql3.2脚本输⼊重定向使⽤输⼊重定向打印安装服务的菜单导航栏;[root@: ~]# cat install.sh#!/usr/bin/bashcat <<-EOF-----------主菜单---------| 1)安装nginx || 2)安装php || 3)退出 |-----------------------EOFread -p "请选择你要安装的软件编号[1|2|3]:"3.3输⼊重定向场景1,恢复数据时2,脚本打印菜单3,cat写⼊⽂件时;vim输出重定向正确输出:1>:覆盖(先清空,后写⼊)1>>:直接写⼊⽂件的尾部(末尾)错误输出2>:覆盖(先清空,后写⼊)2>>:直接写⼊⽂件的尾部(末尾)混合输出&>/dev/null&>>/dev/null1>/dev/null 2>&14,进程管道技术4.1 什么是管道管道操作符合"|",主要⽤来链接左右两个命令,将左侧命令的【标准输出】,交给右侧命令的【标准输⼊】⽆法传递错误的标准输出给后者命令管道命令符可以让⼤家进⼀步掌握命令之间的搭配使⽤⽅法,进⼀步提⾼命令输出值的处理效率4.2管道流程⽰意图格式:cmd1 | cmd2 [...|cndn]4.3管道使⽤案例案例1:将/etc/passwd中的⽤户按UID⼤⼩排序[root@: ~]#sort -t ":" -k3 -n /etc/passwd[root@: ~]#sort -t ":" -k3 -n /etc/passwd -r[root@: ~]#sort -t ":" -k3 -n /etc/passwd |head案例2:统计当前/etc/passwd中⽤户使⽤的shell类型#取出第七列(shell)|排序(相同的归类)|去重[root@: ~]#awk -F:`{pint $7}` /etc/passwd |sort |uniq -c案例3:打印并输出当前所有主机⽹卡的IP地址[root@: ~]#ip addr |grep 'inet' |awk '{print $2}' |awk -F "/" '{print $1}'4.4.1,tee与xargs[root@: ~]#ip addr |grep 'inet' |tee ip.txt |awk -F "/" '{print $1}' |awk '{print $2}'[root@: ~]#cat ip.txt4.4.2,管道中使⽤xargsxargs参数传递,主要让⼀些不⽀持管道的命令可以使⽤管道技术[root@: ~]#which cat |xargs ls -l-rwxr-xr-x. 1 root root 54080 Apr 11 2018 /usr/bin/cat[root@: ~]# xargs rm -fv。
Shell脚本中的性能优化技巧减少资源占用和提高执行速度Shell脚本中的性能优化技巧——减少资源占用和提高执行速度Shell脚本是一种运行在Unix和Linux系统上的脚本语言,它可以通过命令行界面执行一系列的Shell命令来完成特定的任务。
然而,在编写Shell脚本时,我们往往需要考虑如何优化脚本的性能,以减少资源占用和提高执行速度。
本文将介绍一些Shell脚本中的性能优化技巧,帮助您编写更高效的脚本。
一、使用合适的Shell解释器在编写Shell脚本时,我们可以选择不同的Shell解释器来执行脚本。
常见的Shell解释器有Bash、Sh、Ksh等。
这些解释器在性能上有所差异,选择合适的解释器能够提高脚本的执行效率。
一般来说,Bash是性能最好的Shell解释器,因此建议优先选择Bash作为默认解释器。
二、避免频繁的文件读写操作在Shell脚本中,频繁的文件读写操作会占用大量的系统资源,因此我们应该尽量避免不必要的文件读写操作。
可以通过使用变量来代替文件操作的结果,减少文件读写的次数。
另外,可以合并多次读写操作,减少系统调用的开销,从而提高脚本的执行速度。
三、合理使用管道和重定向管道和重定向是Shell脚本中非常实用的功能,可以将一个命令的输出作为另一个命令的输入,或者将命令的输出重定向到文件中。
然而,不当使用管道和重定向会导致额外的系统开销,降低脚本的性能。
因此,我们应该合理使用管道和重定向,避免不必要的数据传输和重定向操作。
四、减少循环和条件判断次数循环和条件判断是Shell脚本中常用的控制结构,但是频繁的循环和条件判断会消耗大量的时间和资源。
为了提高脚本的执行速度,我们可以考虑减少循环和条件判断的次数。
可以通过优化算法和数据结构,减少无谓的判断或者循环,从而降低系统资源的占用。
五、使用并行执行来提高效率在一些需要处理大量数据的任务中,可以通过并行执行来提高脚本的效率。
可以使用Shell的后台执行功能,同时运行多个任务,以减少总的执行时间。
linux输⼊输出重定向及案例重定向什么是重定向?将原本要输出在屏幕中的内容,重新定向输出到指定的⽂件或设备中。
** 为什么要使⽤重定向?**1.备份时,我们需要知道备份的结果2.屏幕上输出信息,⽐较重要的时候,我们想要保存下来3.定时任务,我们需要知道结果4.执⾏命令时,明知道会报错,我们会使⽤重定向,将结果放⼊ /dev/null5.执⾏命令时,正确结果和错误结果会同时输出,将正确结果输出到常规⽇志,将错误结果输出到错误⽇志重定向的分类标准输⼊标准输出名称⽂件描述符作⽤标准输⼊(stdin)0通常键盘(其他输⼊命令的终端设备)标准输出(stdout)1默认输出到屏幕错误输出(stderr)2默认输出到屏幕⽂件名(filename)3+-[root@localhost ~]# ll /dev/std*lrwxrwxrwx 1 root root 15 3⽉ 25 10:36 /dev/stderr -> /proc/self/fd/2lrwxrwxrwx 1 root root 15 3⽉ 25 10:36 /dev/stdin -> /proc/self/fd/0lrwxrwxrwx 1 root root 15 3⽉ 25 10:36 /dev/stdout -> /proc/self/fd/1[root@localhost ~]# ll /proc/121169/fd/总⽤量 0lrwx------ 1 root root 64 4⽉ 7 11:28 0 -> /dev/pts/3lrwx------ 1 root root 64 4⽉ 7 11:28 1 -> /dev/pts/3lrwx------ 1 root root 64 4⽉ 7 11:27 2 -> /dev/pts/3lr-x------ 1 root root 64 4⽉ 7 11:28 3 -> /var/log/messages输出重定向/dev/null/dev/pts/0/dev/pts/1/tmp/zls.txt/root/1.txt类型符号⽤途备注标准覆盖输出重定向1>将命令执⾏的正确结果默认输出的位置,修改为指定的⽂件或者终端(覆盖原有内容)通常'>'即可,1可以不写,默认就是1标准追加输出重定向>>将命令执⾏的正确结果,输出到指定⽂件的末尾(不覆盖原有内容)-错误覆盖输出重定向2>将命令执⾏的错误结果默认输出的位置,修改为指定的⽂件或者终端(覆盖原有内容)-错误追加输出重定向2>>将命令执⾏的错误结果,输出到指定⽂件的末尾(不覆盖原有内容)-标准输⼊重定向0<将命令中接收输⼊内容由默认的键盘,改为命令或者⽂件通常'<'即可0可以写也可以不写,默认0标准输⼊追加重定向0<<将命令中接收输⼊内容由默认的键盘,改为命令或者⽂件-# 标准覆盖输出重定向[root@localhost ~]# echo wxx>/tmp/1.txt[root@localhost ~]# cat /tmp/1.txtwxx[root@localhost ~]# echo 321>/tmp/2.txt[root@localhost ~]# cat /tmp/2.txt[root@localhost ~]# echo wxx1>/tmp/3.txt[root@localhost ~]# cat /tmp/3.txtwxx1**标准追加输出重定向**标准追加输出重定向[root@localhost ~]# echo 456 >> /var/log/messages[root@localhost ~]# echo 123 >> /var/log/messages**错误输出重定向**错误输出重定向[cdx@localhost ~]$ find /etc/ -type d**将标准输出和错误输出都输出到相同的⽂件中**将标准输出和错误输出都输出到相同的⽂件中[cdx@localhost ~]$ find /etc/ -type d > /tmp/100.txt 2>&1[cdx@localhost ~]$ find /etc/ -type d &> /tmp/101.txt**将错误输出,重定向到⿊洞**将错误输出,重定向到⿊洞[root@localhost ~]# ls / /ooo 2>/dev/null**脚本中使⽤重定向**脚本中使⽤重定向!/bin/bash. /etc/init.d/functionsread -p "请输⼊要检测的IP:" IPping -c1 -W1 $IP &>/dev/nullif [ ? -eq 0 ];then action "IP" /bin/true >> /tmp/IP_OK.txtelseaction "$IP" /bin/false >> /tmp/IP_FAILD.txtfi输⼊重定向[root@localhost ~]# mail -s "$(date +%F-%T)_test" 11111@ < /etc/passwd[root@localhost opt]# echo -e "111\n222\n333" > file1.txt[root@localhost opt]# cat file1.txt111222333[root@localhost opt]# echo '1111222233334444' > file2.txt[root@localhost opt]# cat >> 1.txt <<EOF> aaa> bbb> ccc> ddd> EOF[root@localhost opt]# cat >> 2.txt111222333444Ctrl + d 结束cat <<EOF+--------------------------+| vmware manager |+--------------------------+| by wxx |+--------------------------+| 1. Install KVM || 2. Install or Reset C6.5 || 3. Install or Reset C7.4 || 5. Instqll or Reset W7 || 6. Remove all || q. quit |+--------------------------+EOF[root@localhost opt]# cat <<EOF> 1.install mysql> 2.install nginx> 3.intsall php> 4.install tomcat> 5.install redis> EOF1.install mysql2.install nginx3.intsall php4.install tomcat5.install redis# 两条命令同时重定向[root@localhost opt]# (ls ; date) > 1.txt(while :; do date; sleep 2; done) &>date.txt &#如果不希望某些命令的执⾏对当前 shell 环境产⽣影响,请在subshell中执⾏[root@localhost ~]# (cd /boot; ls)管道技术管道操作符号:|,叫做管道符作⽤:将管道符左边命令的标准输出,交给管道符右边命令的标准输⼊来处理⽤法:cmd1|cmd2|cmd3| cmd4...# 取出passwd⽂件中,uid最⼤的前五个[root@localhost ~]# sort -nr -k 3 -t ':' /etc/passwd|head -5# 统计出passwd⽂件中,所有⽤户的shell种类[root@localhost ~]# awk -F: '{print $7}' /etc/passwd|sort |uniq|wc -l6[root@localhost ~]# hostname -I10.0.0.200[root@localhost ~]# ifconfig |awk 'NR==2{print $2}'10.0.0.200sedawkgrep组合:sed awkgrep awk10种⽅法,取IP# 取出磁盘已使⽤百分⽐[root@localhost ~]# df -h|awk '{print $5}'|awk -F '%' '{print $1}'已⽤912451# tee 和重定向的区别tee会将输出结果显⽰在屏幕上[root@zls ~]# date > date.txt[root@zls ~]# date |tee date.txt#xargs:将管道前⾯的结果当成管道后⾯命令的参数[root@localhost opt]# find /etc/ -name '*.conf'|xargs cp -t /tmp/⼗种⽅式取ip⼗种⽅法取ip[root@wzh ~]# ifconfig|awk 'NR==2 {print $2}'10.0.0.200[root@wzh ~]# ifconfig|sed -nr '2s#.*et (.*) ne.*#\1#gp'10.0.0.200[root@wzh ~]# ifconfig|grep -w 'broadcast'|cut -d ' ' -f1010.0.0.200[root@wzh ~]# ifconfig|sed -n '2p'|awk '{print $2}'10.0.0.200[root@wzh ~]# ifconfig|grep -w 'broadcast'|sed -r 's#.*et (.*) ne.*#\1#g'10.0.0.200[root@wzh ~]# ifconfig |head -2|tail -1|cut -d ' ' -f1010.0.0.200[root@wzh ~]# ifconfig|grep -w 'broadcast'|cut -c 14-2410.0.0.200[root@wzh ~]# ifconfig|awk 'NR==2'|cut -d 't' -f2|cut -d 'n' -f110.0.0.200[root@wzh ~]# ifconfig|sed -n '2p'|grep -o '[0.-9]*'|head -110.0.0.200[root@wzh ~]# ifconfig|sed -n '2p'|cut -d ' ' -f1010.0.0.200练习题01.复制/etc/passwd⽂件到当前⽬录下,把⽂件中的:替换成#,不能使⽤sed和vim命令。
高级技巧使用命令输出重定向在Shell脚本中生成文件在Shell脚本中使用命令输出重定向的高级技巧生成文件Shell脚本是一种用于自动化执行操作系统命令的脚本语言。
在Shell脚本中,我们经常需要将命令的输出保存到文件中,以供后续使用或记录日志。
在本文中,将介绍一些高级技巧,以使用命令输出重定向的方式在Shell脚本中生成文件。
一、重定向的基本概念在Shell脚本中,可以使用符号">" 将命令的输出重定向到文件中,而不是在终端上显示。
例如,下面的命令将将"Hello, World!"写入到"output.txt"文件中:```shellecho "Hello, World!" > output.txt```通过这种方式,我们可以将命令的输出保存到文件中,而不会打印到终端上。
但是,这种方式会覆盖目标文件中的原有内容。
如果我们希望将输出添加到文件末尾而不是覆盖原有内容,可以使用">>" 符号:```shellecho "Hello, World!" >> output.txt```二、使用命令输出重定向生成文件除了使用单个命令的输出重定向,我们还可以使用多个命令的组合来生成文件。
下面是一些示例:1. 使用 echo 命令逐行写入内容到文件中:```shellecho "Line 1" > file.txtecho "Line 2" >> file.txtecho "Line 3" >> file.txt```通过上述命令,我们可以将三行内容分别写入到"file.txt"文件中。
2. 使用 ls 命令列出目录下的文件,并将结果保存到文件中:```shellls > file.txt```通过这个命令,我们可以将当前目录下的文件列表保存到"file.txt"文件中。
Linux Shell(bash) 重定向技巧
linux 环境中支持输入输出重定向,用符号<和>来表示。
0、1和2分别表示标准输入、标准输出和标准错误信息输出,
可以用来指定需要重定向的标准输入或输出,比如2>a.txt 表示将错误信息输出到文件a.txt中。
同时,还可以在这三个标准输入输出之间实现重定向,比如将错误信息重定向到标准输出,可以用2>&1来实现。
Linux下还有一个特殊的文件/dev/null,它就像一个无底洞,所有重定向到它的信息都会消失得无影无踪。
这一点非常有用,当我们不需要回显程序的所有信息时,就可以将输出重定向到/dev/null。
如果想要正常输出和错误信息都不显示,则要把标准输出和标准错误都重定向到/dev/null,例如:
# ls 1>/dev/null 2>/dev/null
还有一种做法是将错误重定向到标准输出,然后再重定向到/dev/null,例如:
# ls >/dev/null 2>&1
注意:此处的顺序不能更改,否则达不到想要的效果,此时先将标准输出重定向到/dev/null,然后将标准错误重定向到标准输出,由于标准输出已经重定向到了/dev/null,因此标准错误也会重定向到/dev/null.
1. 标准输入的控制
语法:命令< 文件将文件做为命令的输入。
例如:
mail -s “mail test” wesongzhou@ < file1 将文件file1 当做信件的内容,主
题名称为mail test,送给收信人。
2. 标准输出的控制
语法:命令> 文件将命令的执行结果送至指定的文件中。
例如:
ls -l > list 将执行“ls -l” 命令的结果写入文件list 中。
语法:命令>! 文件将命令的执行结果送至指定的文件中,若文件已经存在,则覆盖。
例如:
ls -lg >! list 将执行“ls - lg” 命令的结果覆盖写入文件list 中。
语法:命令>& 文件将命令执行时屏幕上所产生的任何信息写入指定的文件中。
例如:
cc file1.c >& error 将编译file1.c 文件时所产生的任何信息写入文件error 中。
语法:命令>> 文件将命令执行的结果附加到指定的文件中。
例如:
ls - lag >> list 将执行“ls - lag” 命令的结果附加到文件list 中。
语法:命令>>& 文件将命令执行时屏幕上所产生的任何信息附加到指定的文件中。
例如:
cc file2.c >>& error 将编译file2.c 文件时屏幕所产生的任何信息附加到文件error 中。
关于输入、输出和错误输出
在字符终端环境中,标准输入/标准输出的概念很好理解。
输入即指对一个应用程序或命令的输入,无论是从键盘输入还是从别的文件输入;输出即指应用程序或命令产生的一些信息;与Windows系统下不同的是,Linux系统下还有一个标准错误输出的概念,这个概念主要是为程序调试和系统维护目的而设置的,错误输出于标准输出分开可以让一些高级的错误信息不干扰正常的输出信息,从而方便一般用户的使用。
在Linux 系统中:标准输入(stdin)默认为键盘输入;标准输出(stdout)默认为屏幕输出;标准错误输出(stderr)默认也是输出到屏幕(上面的std 表示standard)。
在BASH 中使用这些概念时一般将标准输出表示为1,将标准错误输出表示为2。
下面我们举例来说明如何使用他们,特别是标准输出和标准错误输出。
输入、输出及标准错误输出主要用于I/O 的重定向,就是说需要改变他们的默认设置。
先看这个例子:
$ ls > ls_result
$ ls -l >> ls_result
上面这两个命令分别将ls 命令的结果输出重定向到ls_result 文件中和追加到ls_result 文件中,而不是输出到屏幕上。
">"就是输出(标准输出和标准错误输出)重定向的代表符号,连续两个">" 符号,即">>" 则表示不清除原来的而追加输出。
下面再来看一个稍微复杂的例子:
$ find /home -name lost* 2> err_result
这个命令在">" 符号之前多了一个"2","2>" 表示将标准错误输出重定向。
由于/home 目录下有些目录由于权限限制不能访问,因此会产生一些标准错误输出被存放在err_result 文件中。
大家可以设想一下find /home -name lost* 2>>err_result 命令会产生什么结果?
如果直接执行find /home -name lost* > all_result ,其结果是只有标准输出被存入all_result 文件中,要想让标准错误输出和标准输入一样都被存入到文件中,那该怎么办呢?看下面这个例子:
$ find /home -name lost* > all_result 2>& 1
上面这个例子中将首先将标准错误输出也重定向到标准输出中,再将标准输出重定向到all_result 这个文件中。
这样我们就可以将所有的输出都存储到文件中了。
为实现上述功能,还有一种简便的写法如下:
$ find /home -name lost* >& all_result
如果那些出错信息并不重要,下面这个命令可以让你避开众多无用出错信息的干扰:
$ find /home -name lost* 2> /dev/null
同学们回去后还可以再试验一下如下几种重定向方式,看看会出什么结果,为什么?
$ find /home -name lost* > all_result 1>& 2
$ find /home -name lost* 2> all_result 1>& 2
$ find /home -name lost* 2>& 1 > all_result
另外一个非常有用的重定向操作符是"-",请看下面这个例子:
$ (cd /source/Directory && tar cf - . ) | (cd /dest/directory && tar xvfp -)
该命令表示把/source/directory 目录下的所有文件通过压缩和解压,快速的全部移动到/dest/directory 目录下去,这个命令在/source/directory 和/dest/directory 不处在同一个文件系统下时将显示出特别的优势。
下面还几种不常见的用法:
n<&- 表示将n 号输入关闭
<&- 表示关闭标准输入(键盘)n>&- 表示将n 号输出关闭
>&- 表示将标准输出关闭。