课后笔记

 8.10 shell特殊符号cut命令

linux下常用的特殊符号:

  • *代表零个或多个任意字符
[root@localhost ~]# ls *.txt
2.txt  3.txt  4.txt  55.txt  sb.txt  w.txt
  • ?只代表有一个任意字符。不管是数字还是字母都能匹配出来
[root@localhost ~]# ls
2.txt  4.txt   anaconda-ks.cfg  w.txt             软件包
3.txt  55.txt  sb.txt           解决依赖关系完成  正在检查事务
[root@localhost ~]# ls ?.txt
2.txt  3.txt  4.txt  w.txt
  • 注释符号#

这个符号在linux中表示注释说明,即#后面的内容都会被忽略

[root@localhost ~]# abc=123 #qqqwqwq
[root@localhost ~]# echo $abc
123
  • 脱义字符

这个字符会将后面的特殊符号还原为普通字符

[root@localhost ~]# ls -d 2.txt\*
ls: 无法访问2.txt*: 没有那个文件或目录

 

 命令cut

cut命令从来截取某一个字段,格式为cut -d ‘分割字符’【-cf】n,这里的n是数字,该命令有几下几个选项:

  • -d:后面跟分隔字符,分隔符要用单引号括起来
  • -c:后面接的是第几个字符(使用-c选项时,就不能使用-d 和-f)
  • -f:后面接的是第几个区块
[root@localhost ~]# cat /etc/passwd|cut -d ':' -f 1|head
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
operator

-d选项后面加冒号作为分隔字符,-f1表示截取的第一段,-f和1之间的空格可有可无

[root@localhost ~]# head -n2 /etc/passwd|cut -c2
o
i
[root@localhost ~]# head -n2 /etc/passwd|cut -c5-10
:x:0:0
x:1:1:
[root@localhost ~]# head -n2 /etc/passwd|cut -c1,3,5
ro:
bnx

-c选项后面可以是1个数字n,也可以是一个区间n1-n2,还可以是多个数字n1,n2,n3.

8.11 sort_wc_uniq命令

在使用sort之前我们man一下

[root@localhost ~]# man sort

       ***  WARNING  ***  The  locale  specified by the environment affects sort order.  Set
       LC_ALL=C to get the traditional sort order that uses native byte values.

会看到man sort里面有了警告一行,就代表你的环境不正常,需要设置一下输入 LC_ALL=C

 sort命令用作排序,格式为sort【-t 分隔符】【-kn1,n2】【-nru】,这里的n1和n2指的是数字,其他选项的含义如下:

  • -t:后面跟分隔字符,作用跟cut的-d选项一样。
  • -n:表示使用纯数字排序
  • -r:表示反向排序
  • -u:表示去重复
  • -kn1,n2:表示由n1区间排序到n2区间,可以只写-kn1,即对n1字段排序

如果sort不加任何选项,则从首字符向后依次按ASCII码值进行比较,最后将他们按升序输出

[root@localhost ~]# head -n5 /etc/passwd |sort
adm:x:3:4:adm:/var/adm:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
root:x:0:0:root:/root:/bin/bash

ASCIII码排序的顺序是先是特殊符号然后是数字然后再是字母

-t选项后面跟分隔符,-k选项后面跟单个数字表示对第几个区域的字符串排序,-n选项则表示使用纯数字

[root@localhost ~]# head -n5 /etc/passwd|sort -t: -k3 -n
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

-k选项后面跟数字n1和n2表示对第n1和n2区域内的字符串排序,-r选项则表示反向排序。示例

[root@localhost ~]# head -n5 /etc/passwd|sort -t: -k3,5 -r
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
root:x:0:0:root:/root:/bin/bash

 

命令wc

wc命令用于统计文档的行数、字符数或词数。该命令的常用选项有-l(统计行数),-m(统计字符)和-w(统计词数)示例

[root@localhost ~]# wc /etc/passwd
 21  33 981 /etc/passwd
[root@localhost ~]# wc -l  /etc/passwd
21 /etc/passwd
[root@localhost ~]# wc -m  /etc/passwd
981 /etc/passwd
[root@localhost ~]# wc -w  /etc/passwd
33 /etc/passwd

 

命令uniq

uniq命令用来删除重复的行,该命令只有-c选项比较常用,它表示统计重复的行数,并把行数写在前面。 我们先编写一个文件,示例

[root@localhost ~]# vim 2.txt

111
222
111
222
333
444
555
444

使用uniq之前,必须先给文件排序,否则不管用。

[root@localhost ~]# uniq 2.txt
111
222
111
222
333
444
555
444

[root@localhost ~]# sort 2.txt|uniq

111
222
333
444
555
[root@localhost ~]# sort 2.txt|uniq -c
      1 
      2 111
      2 222
      1 333
      2 444
      1 555

去重是有条件的,先排序再去重。

 命令tee 

tee命令后面跟文件名,其作用类似于重定向>,但它比重定向多了一个功能,即把文件写入后面所跟文件时,还显示在屏幕上,该命令常用于管道符|后。

[root@localhost ~]# echo "asd" |tee 2.txt
asd
[root@localhost ~]# cat 2.txt
asd

tee -a选项是追加的意思

 命令tr

tr命令用于替换字符,常用来处理文档中出现的特殊字符,如DOS 文档中出现的符号。该命令常用的选项有以下二个

  • -d:表示删除某个字符,后面跟要删除的字符
  • -s:表示删除重复的字符

tr命令常用于把小写字母变为大写字母,如'[a-z]' '[A-Z]' 

[root@localhost ~]# cat 2.txt  
asd
qwqeqwewq
wqeqwewqeqwe
assadasdadsa
dsaddfgrgrtg
[root@localhost ~]# head 2.txt|tr '[a-z]' '[A-Z]'
ASD
QWQEQWEWQ
WQEQWEWQEQWE
ASSADASDADSA
DSADDFGRGRTG

tr命令还可以替换一个字符,示例

[root@localhost ~]# grep 'a' 2.txt |tr 'a' 'z'
zsd
zsszdzsdzdsz
dszddfgrgrtg

 

命令split

split命令用于切割文档,常用的选项为-b和-l。

  • -b:表示依据大小来分割文档,单位为byte,
[root@localhost ~]# mkdir qwer 
[root@localhost ~]# ls
2.txt  4.txt   anaconda-ks.cfg  sb.txt  解决依赖关系完成  正在检查事务
3.txt  55.txt  qwer             w.txt   软件包
[root@localhost ~]# cp /etc/passwd qwer/
[root@localhost ~]# cd qwer      
[root@localhost qwer]# split -b 500 passwd
[root@localhost qwer]# ls
passwd  xaa  xab

如果split不指定目标文件名,则会以xaa xab这样的文件名来存取切割后的文档,我们也可以指定目标文件名

[root@localhost qwer]# rm -f xa*
[root@localhost qwer]# ls
passwd
[root@localhost qwer]# split -b 500 passwd 110
[root@localhost qwer]# ls
110aa  110ab  passwd
[root@localhost qwer]#
  • -l:表示依据行数来分割文档
[root@localhost qwer]# split -l 5 passwd    
[root@localhost qwer]# ls
110aa  110ab  passwd  xaa  xab  xac  xad  xae

 

 8.13 shell特殊符号下

  • 特殊符号$ 

符号$可以用作变量前面的表示符,还可以和!结合起来用

[root@localhost ~]# cat 2.txt
asd
qwqeqwewq
wqeqwewqeqwe
assadasdadsa
dsaddfgrgrtg

[root@localhost ~]# ls !$
ls 2.txt
2.txt
  • 特殊符号;

通常,我们都在一行中数一个命令,然后回车就运行了。如果想在一行中运行二个或二个以上的命令,需要在命令之间加符号

[root@localhost ~]# mkdir 233122 ; touch lilu.txt ; touch liu.test 
[root@localhost ~]# ls
233122  3.txt  55.txt           lilu.txt  qwer    w.txt             软件包
2.txt   4.txt  anaconda-ks.cfg  liu.test  sb.txt  解决依赖关系完成  正在检查事务
  • 特殊符号~

符号~表示用户的家目录,root用户的家目录是/root,普通用户则是/home/username

  • 特殊符号&

如果想把一条命令放到后台执行,则需要加上符号&,它通常用于命令运行时间较长的情况,比如

[root@localhost ~]# sleep 30 &
  • 重定向符号>,>>,2>和2>>

之前讲过重定向符号>和>>,他们分别表示取代和追加的意思。当我们运行一个命令报错时,报错信息会输出到当前屏幕。如果想重定向一个文本,则要用重定向符号2>和2>>,他们分别表示错误重定向和错误追加重定向。

  • 中括号[]

中括号内为字符组合,代表字符组合中的任何一个,可以是一个范围(1-3,a-z)。

  • 特殊符号&& || 

分几种情况:

  1. commod1 ; commod2
  2. commod1 && commod2
  3. commod1  | |  commod2

使用;时,不管commod1是否执行成功,都会执行commod2

使用&&时,只有commod1执行成功后,commod2才会执行,否则commod2不执行

使用||时,commod1执行成功后则conmmod2不执行,否则执行commod2,即commod1 ; commod2总会有一条命令执行。

 拓展知识点

Linux 系统添加操作记录审计

有时候我们需要对线上用户操作记录进行历史记录待出现问题追究责任人,但Linux系统自带的history命令用户有自行删除权限,有时候我们需要对线上用户操作记录进行历史记录待出现问题追究责任人,但Linux系统自带的history命令用户有自行删除权限,那怎么设置可以让用户的操作记录实时记录,并保证普通用户无权删除呢?本文教你一招
 
1.mkdir -p /usr/local/domob/records/
 
  chmod 777 /usr/local/domob/records/
 
  chmod +t /usr/local/domob/records/
 
2.vi /etc/profile 在最后添加下面的代码
 

if [ ! -d  /usr/local/domob/records/${LOGNAME} ]
 
then
 
mkdir -p /usr/local/domob/records/${LOGNAME}
 
chmod 300 /usr/local/domob/records/${LOGNAME}
 
fi
 
export HISTORY_FILE="/usr/local/domob/records/${LOGNAME}/bash_history"
 
export PROMPT_COMMAND='{ date "+%Y-%m-%d %T ##### $(who am i |awk "{print \$1\" \"\$2\" \"\$5}") #### $(history 1 | { read x cmd; echo "$cmd"; })"; } >>$HISTORY_FILE'

PROMPT_COMMAND环境变量

Bash 在显示 PS1 之前先执行 PROMPT_COMMAND 定义的内容:

ramesh@dev-db ~> export PROMPT_COMMAND="date +%k:%m:%S"

22:08:42

ramesh@dev-db ~>

[注: PROMPT_COMMAND 和 PS1 在不同行显示]
如果你想让 PROMPT_COMMAND 和PS1 在同一行显示,用 -n 参数即可:

ramesh@dev-db ~>  export PROMPT_COMMAND="echo  -n [$(date+%k:%m:%S)]"
[22:08:51]ramesh@dev-db ~>

[注: PROMPT_COMMAND 和 PS1 在同一行显示]

 

在shell脚本中调用另一个脚本的三种不同方法(fork, exec, source)

1. fork  ( /directory/script.sh) :如果shell中包含执行命令,那么子命令并不影响父级的命令,在子命令执行完后再执行父级命令。子级的环境变量不会影响到父级。 

fork是最普通的, 就是直接在脚本里面用/directory/script.sh来调用script.sh这个脚本.

运行的时候开一个sub-shell执行调用的脚本,sub-shell执行的时候, parent-shell还在。

sub-shell执行完毕后返回parent-shell. sub-shell从parent-shell继承环境变量.但是sub-shell中的环境变量不会带回parent-shell

2. exec (exec /directory/script.sh):执行子级的命令后,不再执行父级命令。

exec与fork不同,不需要新开一个sub-shell来执行被调用的脚本.  被调用的脚本与父脚本在同一个shell内执行。但是使用exec调用一个新脚本以后, 父脚本中exec行之后的内容就不会再执行了。这是exec和source的区别

3. source (source /directory/script.sh):执行子级命令后继续执行父级命令,同时子级设置的环境变量会影响到父级的环境变量。

与fork的区别是不新开一个sub-shell来执行被调用的脚本,而是在同一个shell中执行. 所以被调用的脚本中声明的变量和环境变量, 都可以在主脚本中得到和使用.

可以通过下面这两个脚本来体会三种调用方式的不同:

1.sh 

#!/bin/bash

A=B 

echo "PID for 1.sh before exec/source/fork:$$"

export A

echo "1.sh: \$A is $A"

case $1 in

        exec)

                echo "using exec…"

                exec ./2.sh ;;

        source)

                echo "using source…"

                . ./2.sh ;;

        *)

                echo "using fork by default…"

                ./2.sh ;;

esac

echo "PID for 1.sh after exec/source/fork:$$"

echo "1.sh: \$A is $A"

 

2.sh 

#!/bin/bash

echo "PID for 2.sh: $$"

echo "2.sh get \$A=$A from 1.sh"

A=C

export A

echo "2.sh: \$A is $A"

 

执行情况: 

$ ./1.sh     

PID for 1.sh before exec/source/fork:5845364

1.sh: $A is B

using fork by default…

PID for 2.sh: 5242940

2.sh get $A=B from 1.sh

2.sh: $A is C

PID for 1.sh after exec/source/fork:5845364

1.sh: $A is B

$ ./1.sh exec

PID for 1.sh before exec/source/fork:5562668

1.sh: $A is B

using exec…

PID for 2.sh: 5562668

2.sh get $A=B from 1.sh

2.sh: $A is C

$ ./1.sh source 

PID for 1.sh before exec/source/fork:5156894

1.sh: $A is B

using source…

PID for 2.sh: 5156894

2.sh get $A=B from 1.sh

2.sh: $A is C

PID for 1.sh after exec/source/fork:5156894

1.sh: $A is C

$

 Linux特殊符号大全    链接:http://ask.apelearn.com/question/7720
Linux sort命令的几个细节问题

Linux sort命令的原理是逐行按字符进行比较排序,当然,也可以通过命令行参数设定按数字进行比较,或者指定行间的分隔符,对某一个或一些字段按照自己指定的规则进行排序。这是一个很常用而且很方便的命令,但是其中的一些细节需要注意,否则会得到错误的排序结果。

1. 比较方式

 前面说过,sort命令默认是按照字符串排序,真的是这样么?看看sort的help信息,末尾有这样的   文字:

  1. *** WARNING ***  
  2. The locale specified by the environment affects sort order.  
  3. Set LC_ALL=C to get the traditional sort order that uses  
  4. native byte values.  

看来,环境变量也能影响sort的排序结果。实际试试看:

~$ cat text  

  1. 11$  
  2. 1{1  
  3. ~$ sort text  
  4. 1{1  
  5. 11$  
  6. ~$ echo $LC_ALL  
  7. ~$  

  论ASCII字符的大小,’{’应该比’1’大,但是上面的结果显示,当LC_ALL变量为空值时,sort命令输出了错误的排序结果。不过,在更多的平台上实验发现,LC_ALL为空的时候并不一定会输出这个错误的结果,具体原因不详。不过,如果按照sort的帮助信息设置LC_ALL,则结果是正确的,’1’排在’{’前面。

        如果了解LC***系列的变量,其实只需要设置LC_COLLATE即可,该变量控制的是字符串的排序方式,在手头上的几种平台上实验,结果都是正确的。

2. 按数字排序

        加-n参数按数字排序。如果一行中还有非数字字符,则按照非数字字符前面的数字大小进行排序

~$ cat text  

  1. 11$  
  2. 1{1  
  3. ~$ export LC_ALL=C  
  4. ~$ sort text  
  5. 11$  
  6. 1{1  
  7. ~$ sort -n text        
  8. 1{1  
  9. 11$  

3. 重定向

        一般sort命令将排序结果输出到终端,如果想写入文件可以用重定向的方式,但是,如果想让排序结果直接写到排序前的文件,用一般的重定向方式sort file_name > file_name达不到效果,需要用sort命令的-o参数。

4. 分隔字段

        默认的排序是以行为单位的排序,如果想按照某个字段进行排序,可以用-t选项指定字段分隔符,-k指定要排序的字段。

        -k参数的格式为-k start[,end],需要注意的是,如果省略了end,则需要比较到行末,例如:

  1. ~$ cat text   
  2. 1|101|2  
  3. 1|10|2  
  4. ~$ echo $LC_ALL  
  5. C  
  6. ~$ sort -t "|" -k 2 text   
  7. 1|101|2  
  8. 1|10|2  
  9. ~$ sort -t "|" -k 2,2 text   
  10. 1|10|2  
  11. 1|101|2  

        虽然10排在101前面,但是不指定字段结束时,默认会继续比较,即比较’|’和’1’,所以有上面的结果。

        通常,我们只希望按照一个或者多个字段排序,而不希望从某个字段开始一直比较到行末,所以用这个参数时最好同时指定start和end。

5. 多条件排序

        在按字段排序时如果想采用多个排序条件,如先按第二列升序,如果相同则按第三列降序,可以使用多个-k参数,如-k 2,2n –k 3,3nr

转载于:https://my.oschina.net/u/3851487/blog/1823038

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值