2018-06-01笔记(特殊符号 、cut、wc、sort、uniq、tee、tr、split)

8.10 shell特殊符号&cut命令

shell常用的几个特殊符号

“*” 代表零个或多个任意字符

[root@localhost ~]# ls  test*
test  test1  test2  test3

“?” 代表一个任意字符

[root@localhost ~]# ls  test?
test1  test2  test3

“#” 注释符号

[root@localhost ~]# a=111 #aaaaa
[root@localhost ~]# echo $a
111

“\” 脱意符号,‘’单引号也有脱意的意思,将特殊符号(例如'*')还原为普通字符

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

“|” 管道符,它的作用在于将符号前面命令的输出当作后面命令的输入,并不是所有的命令都可以的,一般针对文档操作的命令比较常用,例如cat, less, head, tail, grep, cut, sort, wc, uniq, tee, tr, split, sed, awk等等

[root@localhost ~]# cat test.txt |wc -l
0

命令 : cut

用来截取某一个字段

语法: cut -d '分隔字符' [-cf] n 这里的n是数字
-d:指定分隔符号
-f:指定第几段
-c:后面只有一个数字表示截取第几个字符;后面跟一个数字区域,表示截取从几到几(该选项不和d,f共同使用)

[root@localhost tmp]# cut -c1 /etc/passwd
r
b
...
[root@localhost tmp]# cut -c1,4 /etc/passwd              #表示截取第1个和第4个字符
rt
b:
...
[root@localhost tmp]# cut -c1-4 /etc/passwd             #表示截取第1个到第4个字符
root
bin:
...
[root@localhost tmp]# cut -d : -f 3 /etc/passwd         #-d以冒号分割,-f截取第3段
0
1
2

8.11 sort、wc、uniq命令

命令 : sort

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

语法: sort [-t 分隔符] [-kn1,n2] [-nru] 这里的n1 < n2

-t 分隔符 :作用跟cut的-d一个意思

-n :使用纯数字排序,需要注意的是使用-n特殊字符和字母默认为0

-r :反向排序

-u :去重复

-kn1,n2 :由n1区间排序到n2区间,可以只写-kn1,即对n1字段排序

[root@localhost ~]# head -n5 /etc/passwd |sort -t: -k3 -n
-t 后面跟分隔符,-k后面跟数字,表示对第几个区域的字符串排序,-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
[root@localhost tmp]# sort /etc/passwd  
 #不加sort不加任何选项,则从首字符向后,依次按ASCII码值进行比较,最后将他们按升序输出
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
[root@localhost ~]# head -n5 /etc/passwd |sort -t: -k3,5 -r
-k3,5 表示从第3到第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

用于统计文档的行数、字符数、词数,常用的选项为:

-l :统计行数

-m :统计字符数

-w :统计词数

[root@localhost tmp]# wc -l 1.log 
4 1.log
[root@localhost tmp]# cat 1.log 
111
abc
&adfjkd
2233323
[root@localhost tmp]# wc -m 1.log 
### wc -m会统计文件内所有字符,包括隐藏的换行符“&”所以会显示24
24 1.log
[root@localhost tmp]# wc 1.log 
### wc 不跟任何选项,直接跟文档,则会把行数、词数、字符数依次输出
 4  4 24 1.log

命令 : uniq
uniq命令用于报告或忽略文件中的重复行,一般与sort命令结合使用(即:去重复)
语法: uniq [options] [filename]
Options:
-c:=count 在每列旁边显示该行重复出现的次数

[root@localhost tmp]# cat 1.log
111
abc
&adfjkd
2233323
111
abc
[root@localhost tmp]# uniq -c 1.log
      1 111
      1 abc
      1 &adfjkd
      1 2233323
      1 111
      1 abc
###直接使用uniq命令,1.log内容显示并没有变化,使用sort排序后再用uniq命令,在对文件进行去重之前需要先进行排序
[root@localhost tmp]# sort 1.log |uniq -c
      2 111
      1 2233323
      2 abc
      1 &adfjkd

8.12 tee、tr、split命令

命令 : tee
tee 常用在管道符 “|” 后
tee命令用于将数据重定向到文件,会删除文件内原有内容,与“>”不同的是,tee会把定向的文件内容显示出来。
语法: tee [options] [filename]
Options:
-a:向文件中重定向时使用追加模式(=“>>”)

[root@localhost tmp]# echo "aaa"|tee test.txt
aaa
[root@localhost tmp]# cat test.txt 
aaa
[root@localhost tmp]# echo "bbb"|tee test.txt  ##不加-a会把这前的内容清空
bbb
[root@localhost tmp]# cat test.txt
bbb
[root@localhost tmp]# echo "ccc"|tee -a test.txt    ###加了a选项后,追加内容
ccc
[root@localhost tmp]# cat test.txt 
bbb
ccc

命令 : tr
替换字符,常用来处理文档中出现的特殊符号,它可以将一个字符变成另一个字符,也可以将一组字符变成另一组字符

[root@localhost tmp]# head -3 /etc/passwd|tr 'a-z' 'A-Z' 
ROOT:X:0:0:ROOT:/ROOT:/BIN/BASH
BIN:X:1:1:BIN:/BIN:/SBIN/NOLOGIN
DAEMON:X:2:2:DAEMON:/SBIN:/SBIN/NOLOGIN
[root@localhost tmp]# head -3 /etc/passwd |tr 'b' 'B'
root:x:0:0:root:/root:/Bin/Bash
Bin:x:1:1:Bin:/Bin:/sBin/nologin
daemon:x:2:2:daemon:/sBin:/sBin/nologin

命令 : split
split命令可以将一个大文件分割成很多个小文件,有时需要将文件分割成更小的片段,比如为提高可读性,生成日志等
语法: split [options] [filename]
-b:指定每一输出档案的大小,默认单位为 byte,可自定义单位,如 split -b 100M filename
-l:指定每一个输出档案的行数多少

 [root@localhost tmp]# dd if=/dev/zero of=/tmp/2.log bs=20K count=1           ###生成一个20K的文件
记录了1+0 的读入
记录了1+0 的写出
20480字节(20 kB)已复制,0.000199124 秒,103 MB/秒
[root@localhost tmp]# du -sb /tmp/2.log 
20480   /tmp/2.log
[root@localhost tmp]# split -b 5k /tmp/2.log luo                                           ##-b把2.log按照5K一个文件进行分割,luo指定分割后文件前缀!
[root@localhost tmp]# ll
-rw-r--r-- 1 root root 20480 6月   3 17:40 2.log
-rw-r--r-- 1 root root  5120 6月   3 17:41 luoaa
-rw-r--r-- 1 root root  5120 6月   3 17:41 luoab
-rw-r--r-- 1 root root  5120 6月   3 17:41 luoac
-rw-r--r-- 1 root root  5120 6月   3 17:41 luoad

-l:指定每一个输出档案的行数多少

[root@localhost tmp]# wc -l 1.txt              
20 1.txt
[root@localhost tmp]# split -l 5 1.txt
[root@localhost tmp]# ls
xaa
xab
xac
xad
[root@localhost tmp]# wc -l x*
  5 xaa
  5 xab
  5 xac
  5 xad

8.13 shell特殊符号(下)
$ 除了用于变量前面的标识符外,和 ‘!’ 结合起来使用,表示上一条命令中的最后一个变量

[root@localhost tmp]# ls 1.log 
1.log
[root@localhost tmp]# cat !$             #这里可以看到!$表示上一条命令的1.log
cat 1.log
111
abc

`~ : 用户的家目录,如果是root则是 /root ,普通用户则是 /home/username

[root@localhost ~]# cd ~
[root@localhost ~]# pwd
/root
[root@localhost ~]# su test
[test@localhost root]$ cd ~
[test@localhost ~]$ pwd
/home/test

& : 如果想把一条命令放到后台执行的话,则需要加上这个符号。通常用于命令运行时间非常长的情况

[root@localhost tmp]# sleep 10&
[1] 1831
[root@localhost tmp]# jobs
[1]+  运行中               sleep 10 &

,>, >>, 2>, 2>> 正确的写法应该是(1> 1>> 2> 2>> ,1表示正确输出重定向和追加,2表示错误输出重定向和追加,通常1可以忽略不写)如果想要正确和错误输出都写到一个文件里可以这样2>&1

[root@localhost tmp]# mkdir 222
[root@localhost tmp]# cd 222
[root@localhost 222]# ll
总用量 0
[root@localhost 222]# touch 1.txt 2.txt 3.txt
[root@localhost 222]# ll
总用量 0
-rw-r--r-- 1 root root 0 6月   3 17:57 1.txt
-rw-r--r-- 1 root root 0 6月   3 17:57 2.txt
-rw-r--r-- 1 root root 0 6月   3 17:57 3.txt
[root@localhost 222]# ls 1.txt 2.txt 3.txt 4.txt >5.txt 2>&1
[root@localhost 222]# cat 5.txt
ls: 无法访问4.txt: 没有那个文件或目录
1.txt
2.txt
3.txt

命令连接符: “||”、“&&”、“;”
command1 ; command2 : 不管command1是否执行成功都会执行command2
command1 && command2 : 只有command1执行成功后才会执行command2
command1 || command2 : 表示command1执行成功后,command2不执行,否则执行command2
扩展链接:
Linux 系统添加操作记录审计

有时候我们需要对线上用户操作记录进行历史记录待出现问题追究责任人,,但Linux系统自带的history命令用户有自行删除权限,那怎么设置可以让用户的操作记录实时记录,并保证普通用户无权删除呢?

1.mkdir -p /usr/local//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环境变量的含义 http://www.linuxnote.org/prompt_command-environment-variables.html
source exec 区别 http://alsww.blog.51cto.com/2001924/1113112
Linux特殊符号大全 http://ask.apelearn.com/question/7720
sort并未按ASCII排序 http://blog.csdn.net/zenghui08/article/details/7938975

猜你喜欢

转载自blog.51cto.com/13736286/2124213