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)。
- 特殊符号&& ||
分几种情况:
- commod1 ; commod2
- commod1 && commod2
- 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信息,末尾有这样的 文字:
- *** 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.
看来,环境变量也能影响sort的排序结果。实际试试看:
~$ cat text
- 11$
- 1{1
- ~$ sort text
- 1{1
- 11$
- ~$ echo $LC_ALL
- ~$
论ASCII字符的大小,’{’应该比’1’大,但是上面的结果显示,当LC_ALL变量为空值时,sort命令输出了错误的排序结果。不过,在更多的平台上实验发现,LC_ALL为空的时候并不一定会输出这个错误的结果,具体原因不详。不过,如果按照sort的帮助信息设置LC_ALL,则结果是正确的,’1’排在’{’前面。
如果了解LC***系列的变量,其实只需要设置LC_COLLATE即可,该变量控制的是字符串的排序方式,在手头上的几种平台上实验,结果都是正确的。
2. 按数字排序
加-n参数按数字排序。如果一行中还有非数字字符,则按照非数字字符前面的数字大小进行排序
~$ cat text
- 11$
- 1{1
- ~$ export LC_ALL=C
- ~$ sort text
- 11$
- 1{1
- ~$ sort -n text
- 1{1
- 11$
3. 重定向
一般sort命令将排序结果输出到终端,如果想写入文件可以用重定向的方式,但是,如果想让排序结果直接写到排序前的文件,用一般的重定向方式sort file_name > file_name达不到效果,需要用sort命令的-o参数。
4. 分隔字段
默认的排序是以行为单位的排序,如果想按照某个字段进行排序,可以用-t选项指定字段分隔符,-k指定要排序的字段。
-k参数的格式为-k start[,end],需要注意的是,如果省略了end,则需要比较到行末,例如:
- ~$ cat text
- 1|101|2
- 1|10|2
- ~$ echo $LC_ALL
- C
- ~$ sort -t "|" -k 2 text
- 1|101|2
- 1|10|2
- ~$ sort -t "|" -k 2,2 text
- 1|10|2
- 1|101|2
虽然10排在101前面,但是不指定字段结束时,默认会继续比较,即比较’|’和’1’,所以有上面的结果。
通常,我们只希望按照一个或者多个字段排序,而不希望从某个字段开始一直比较到行末,所以用这个参数时最好同时指定start和end。
5. 多条件排序
在按字段排序时如果想采用多个排序条件,如先按第二列升序,如果相同则按第三列降序,可以使用多个-k参数,如-k 2,2n –k 3,3nr