一   文件的 权限基础

文件有三类权限   user,group,other,

权限分为 r w x  代表数字分别为 4 2 1

修改权限命令 chmod  

权限还有特殊权限,在执行的时候代表某一身份的权限去执行

分别有文件拥有者权限,组权限,所有人权限。

文件拥有者身份的权限即在 user权限将执行权限x改成s。即 rwx=>rws来表示。权限值则为在原有权限前加4000.如原权限为 755,则现权限则变更为4755

组身份权限 即将组的执行权限的x变更为s。权限值为在原有权限前+2000.即755=》2755

所有人执行的权限即在所有人权限组中将x=》s。权限值+1000   即 755=》1755  

 

chmod命令,可以用权限值也可以用标识符

即  chmod +x aa.sh   等同于chmod 755 aa.sh.即对三种身份加上可执行权限

单独针对某一群组增加可执行权限,可以如下操作

chmod u+x/g+x/o+x来操作

去掉某一群组的权限

chmod u-x/g-x/o-x来操作执行

 

二  通配符

重点的两个通配符   *   和?

* 代表任意字符,可以是空字符串

?代表单一字符,不可以为空字符

 

ls -la /usr/bin/*   #列出bin下的所有文件


ls -la /usr/bin/????  #列出bin下的四个字符的文件

 

还有一些例子。我觉得很实用

 

 

 

转义字符 “ \”

例  echo 9  \*  9 =81   即将*转义成乘号

注意: 单引号转义

echo 'This is jack's book'   这种就无法通过\转义  ,echo 'This is jack\'s book' 因为在shell中,系统会将\当成续航符,认为输入未完成,而允许用户继续输入

争取的做法为

echo This is jack's book   外层不加单引号

echo "This is jack's book"     用双引号括起来

echo 'This is jack'\''s book'

 

常见的转义字符有

 

字符集合

用途:对集合内部的任意字符进行匹配,字符集合就是【】中所列的字符范围中的某一个字符,其长度为1

符号:  【】

例子:
ls -la [abc]*  #查询首字母为a,b,c的所有文件

 

 注意:   “-”字符,因为该字符代表的是字符集合的范围,如上图中【a-z】表示从a-z范围中的任意字符。拿如果要表示-字符时,就需要用下划线_放到横杠的前面来表示待-的字符

ls -la /usr/bin/[a-z_-]#表示查询从a-z以及带-字符的所有文件

非 集合 !

如[!0-9】  【!a-z】等

如果要将!认作叹号而非   非集合字符时,则需要转义字符\来转义

注意:在集合中,无论是.还是*都只代表单一字符,没有任何其他的特殊含义。

[123,*]    #只代表1,23 ,.,*这五个字符其中之一

 

 

 括号扩展

  字符串组合 {}

ls -la /usr/bin/{g,nc,s}ftp #将{}中的字符与后面的ftp进行组合查询

举例说明

ls -la /usr/{sb,b}in/*er    #查询sbin和bin中的所有以er结尾的文件

 

 

[root@localhost ~]# echo {1,2,3,4,5,6,7,8,9}\*{1,2,3,4,5,6,7,8,9}  
1*1 1*2 1*3 1*4 1*5 1*6 1*7 1*8 1*9 2*1 2*2 2*3 2*4 2*5 2*6 2*7 2*8 2*9 3*1 3*2 3*3 3*4 3*5 3*6 3*7 3*8 3*9 4*1 4*2 4*3 4*4 4*5 4*6 4*7 4*8 4*9 5*1 5*2 5*3 5*4 5*5 5*6 5*7 5*8 5*9 6*1 6*2 6*3 6*4 6*5 6*6 6*7 6*8 6*9 7*1 7*2 7*3 7*4 7*5 7*6 7*7 7*8 7*9 8*1 8*2 8*3 8*4 8*5 8*6 8*7 8*8 8*9 9*1 9*2 9*3 9*4 9*5 9*6 9*7 9*8 9*9

 

系统默认开启文件

每个shell script执行时,系统都会默认开启三个标准文件。标准输入 stdin 标准输出 strout 标准错误 strerr

 

 这里有个文件代码的概念,我没有理解,他的用途是什么?百度了一下,找到了答案:

 

摘抄  https://www.cnblogs.com/YaoDD/p/4921685.html

shell script 学习笔记-----标准输出

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文档中

 

前后台工作

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

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

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

 

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

 

posted on 2019-09-20 17:53  孤独斗士  阅读(327)  评论(0编辑  收藏  举报