shell 基础

Posted 重生

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shell 基础相关的知识,希望对你有一定的参考价值。

1、将标准输出(stdout)和标准错误输出(stderr)分别重定向到两个不同的文件

其中符号\'>\'默认将标准输出重定向,意思和\'1>\'相同,‘2>\'表示重定向标准错误输出,数字1和2其实是文件描述符,在Linux下默认1为标准输出STDOUT,2为标准错误输出STDERR

2、将标准输出和标准错误输出重定向到同一个文件中,共有下图所示三种写法,后两种写法可以认为符号&是作为特殊标记了,第一种写法则可以看做先将STDOUT输出到both文件,“2>&1”则可将1理解为标准输出重定向的文件,然后“2>&1”相当于一个赋值操作,将文件描述符2指向的文件赋值为文件描述符1指向的文件

3、重定向符\'>\'默认会将目标文件清空(如果存在的话),然后添加重定向的内容。如果需要在目标文件的末尾进行添加,则需要使用">>"重定向符,如下所示

4、/dev/null是Unix/Linux系统中一个特殊的设备,它并不是真正的设备,所有你认为没用的数据都可以重定向到它,并且不会占据任何磁盘空间,如下图就将错误信息扔进了/dev/null中

5、将多个命令的输出重定向到同一个文件有以下两种方式,但是基于的原理是完全不同的,花括号那组其实只是将括号中命令的输出集中重定向而已,但是普通括号内的命令是在子shell,也就是subshell中运行的。这时我们就会发现,因为cd指令的存在,第一条命令运行后我们仍在之前的目录(因为subshell中位置的改变与父shell无关),但是第二条指令运行之后,我们就在上级目录了

6、将一个程序的输出作为另一个程序的输入,最常见的如下图所示,但是需要注意的是,这两个程序是运行在不同的subshell中的!

7、将管道中的数据流备份:使用如下所示是tee命令,它将数据量输入下一级管道的同时,将它们备份到tee.file文件中

8、将数据重定向到多个文件中,如下图所示,其实本质上就是将写入不同文件描述符的数据重定向到不同的文件中,这样的话,在程序中可以不事先打开文件,而直接向文件描述符写数据,例如:write(3,buf,255),就是直接向文件描述符3写数据,而我事先并没有打开文件的操作

9、如果没有使用特殊的手法,例如将STDERR重定向至STDOUT或者在程序中就进行重定向,那么管道只重定向STDOUT,我们没有办法只重定向STDERR而不重定向STDOUT

10、交换STDOUT和STDERR:如果你想要将STDOUT输出到stdout.logfile中,并且通过tee将STDERR即输出到屏幕又输出到stderr.logfile。这时就需要使用下图所示的方法。其实本质上就是交换了STDOUT和STDERR。类似于两个整数的交换。首先将描述符3赋值为1,即STDOUT,再将标准输出的内容输出到stdout.logfile中,最后"2>&3"表示将标准错误的数据往标准输出中写,因为此时描述符3的值就是标准输出,这样标准错误的内容就能通过标准输出通过管道了

11、我们知道重定向符号\'>\'会覆盖目标文件中的内容,那么为了防止误操作导致重定向覆盖了我们原先不想被覆盖的文件,我们可以采用如下的方法,如果要恢复默认设置,使用“set +o noclobber”,如果在已经设置了noclobber的情况下,仍然强行做一次重定向覆盖操作,则可使用类似“echo do it >| my.file”的方法,“>|”表示强行重定向覆盖操作

 

 

参考文献:《bash Cookbook》,Carl Albing

  看到以上的摘抄之后,尤其是第一和第二两个举例,我们就可以明白,可以通过1,2来将输出信息重定向。

 

 标准输入/输出转向


将标准输入/标准输出 重新定向到别的文件。就是上面摘抄中的举例1,2等。学过鸟叔的书中,可以看到,很多shell都会将输出定向到/dev/null这个黑洞中。就是这样用的。

 

转向输出时,如果输出文件不存在则会创建新文件,如果已存在,则会将源文件内容清空,再输出。如果想在后面继续附加内容,则需要转向附加操作符

>>  则会在文件后面追加标准输出的内容

转向输入

[root@localhost ~]# wc -l
1
2
3
4
5
5#按ctrl+D,则会输出输入的行数
[root@localhost ~]# 

同样,如果我们要统计某一个文档的行数时,可以利用标准输入专向来操作。例

[root@localhost ~]# cat /var/log/pcp/pmlogger/pmlogger_daily.stamp     #查看该文件的内容。可以看到有两行内容
# 2019-09-20 15:30:01
1568964601
[root@localhost ~]# wc -l < /var/log/pcp/pmlogger/pmlogger_daily.stamp  #将该文件,输入到wc-l中
2
[root@localhost ~]# 

 

转向输出和转向输入的混合使用

用法: 命令或Script < 输入文件 >输出文件

将输入文件的内容,输出到输出文件中

sort < unsort.txt > sorted.txt #将未排序的unsort.txt文件的内容,排序后输出到sorted.txt文件中

 

利用转向输出做简易编辑

 

[root@localhost ~]# cat > out.sh
#! /bin/bash
 
echo hello world![root@localhost ~]# sh out.sh
hello world!
[root@localhost ~]# man cat
CAT(1)                                                                                                            GNU                                                                                                           CAT(1)

NAME
       cat - 连接文件并在标准输出上输出

SYNOPSIS 总览
       cat [选项列表] [文件列表]...

DESCRIPTION 描述
       将文件列表中的文件或标准输入连接到标准输出。

       -A, --show-all
              等价于 -vET 。

       -b, --number-nonblank
              给非空输出行编号。

       -e     等价于 -vE 。

       -E, --show-ends
              在每行结束显示 $ 。

       -n, --number
              给所有输出行编号。

       -s, --squeeze-blank
              将所有的连续的多个空行替换为一个空行。

       -t     等价于 -vT 。

       -T, --show-tabs
              把 TAB 字符显示为 ^I 。

       -u     (被忽略的选项)

       -v, --show-nonprinting
              除了 LFD 和 TAB 之外所有控制符用 ^ 和 M- 记方式显示。

       --help 显示帮助并退出。

       --version
              显示版本信息并退出。

       没有指定文件或指定的文件是 -,则从标准输入读取。

 

管道

管道的意义:

管道的意思就是将一个程序的输出,放到管道中,作为另一个程序的输入。从而链接两个程序之间的通道

用法:

基本型 : 命令1 | 命令2

[root@localhost ~]# cat unsort.txt | sort
读取unsort.txt内容,用sort命令排序
[root@localhost ~]# cat unsort.txt | sort > sorted.txt
读取unsort.txt内容,用sort命令排序后输出到sorted.txt文档中
[root@localhost ~]# cat sorted.txt | lp
读取sorted.txt内容输出到lp打印程序中

多管道组合: 命令1 | 命令2 | 命令3 |。。。。| 命令n

一个查询apache日志中 4XX错误的脚本

[root@localhost ~]# grep \'".*" 4[0-9][0-9]\' access.log | grep -o \'".*" 4[0-9][0-9]\' | sort | uniq -c | sort -n | tee alog.txt

 grep从access.log中将行按照要求取出来=》将这些行按匹配要求取出相应的数据=》排序=》删除重复行,并统计重复数据的次数=》排序=》交给tee打印并输出到alog.txt文档中

 

前后台工作

这个在鸟个的书中也学习过,就是前后台搭配使用。

& 符号 。意思就是将命令丢到后台执行

当后台执行完毕后,会出现

 

很简单,不是么?如果想详细了解,还是要看鸟哥的前后台的文章。

 

以上是关于shell 基础的主要内容,如果未能解决你的问题,请参考以下文章

Linux bash基础特性二

逆向及Bof基础实践

20155307刘浩《网络对抗》逆向及Bof基础

代码片段:Shell脚本实现重复执行和多进程

20155311高梓云《网络对抗》逆向及Bof基础

20145301赵嘉鑫《网络对抗》逆向及Bof基础