8.10 shell特殊符_cut命令
* 匹配任意字符;
?匹配任意单个字符;
# 注释字符;
\ 脱意字符;
| 管道字符。
cut命令:用来显示行中的指定部分,删除文件中指定字段。
选项:
- -b:仅显示行中指定直接范围的内容;
- -c:仅显示行中指定范围的字符;
- -d:指定字段的分隔符,默认的字段分隔符为“TAB”;
- -f:显示指定字段的内容;
- -n:与“-b”选项连用,不分割多字节字符;
- --complement:补足被选择的字节、字符或字段;
- --out-delimiter=<字段分隔符>:指定输出内容是的字段分割符;
- --help:显示指令的帮助信息;
- --version:显示指令的版本信息。
用cut命令对 /etc/passwd 的前两行进行截取操作(操作不会影响源文件)。
[root@liang-00 ~]# cat /etc/passwd |head -n2 |cut -d ":" -f 1 #用“:”进行分割,截取第一段; root bin [root@liang-00 ~]# cat /etc/passwd |head -n2 |cut -d ":" -f 1,2 #用“:”进行分割,截取第一段和第二段; root:x bin:x [root@liang-00 ~]# cat /etc/passwd |head -n2 |cut -d ":" -f 1-3 #用“:”进行分割,截取一到三段; root:x:0 bin:x:1 [root@liang-00 ~]# cat /etc/passwd |head -n2 |cut -c 1-3 #截取从第一个到第三个字符; roo bin [root@liang-00 ~]# cat /etc/passwd |head -n2 |cut -c -5 #截取从第一个到第五个字符; root: bin:x [root@liang-00 ~]# cat /etc/passwd |head -n2 |cut -c 5- #截取从第五个到最后一个符; :x:0:0:root:/root:/bin/bash x:1:1:bin:/bin:/sbin/nologin [root@liang-00 ~]#
cut命令默认的分隔符为“Tab”。
8.11 sort_wc_uniq命令
sort命令是在Linux里非常有用,它将文件进行排序,并将排序结果标准输出。
参数:
- -b:忽略每行前面开始出的空格字符;
- -c:检查文件是否已经按照顺序排序;
- -d:排序时,处理英文字母、数字及空格字符外,忽略其他的字符;
- -f:排序时,将小写字母视为大写字母;
- -i:排序时,除了040至176之间的ASCII字符外,忽略其他的字符;
- -m:将几个排序号的文件进行合并;
- -M:将前面3个字母依照月份的缩写进行排序;
- -n:依照数值的大小排序;
- -o<输出文件>:将排序后的结果存入制定的文件;
- -r:以相反的顺序来排序;
- -t<分隔字符>:指定排序时所用的栏位分隔字符;
- +<起始栏位>-<结束栏位>:以指定的栏位来排序,范围由起始栏位到结束栏位的前一栏位。
用 sort 对 /etc/passwd 进行排序。
[root@liang-00 ~]# sort /etc/passwd
adm:x:3:4:adm:/var/adm:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
halt:x:7:0:halt:/sbin:/sbin/halt
liang:x:1000:1000::/home/liang:/bin/bash
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
nginx:x:997:995:Nginx web server:/var/lib/nginx:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
root:x:0:0:root:/root:/bin/bash
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
可以看到:sort 命令将以默认的方式将文本文件的第一列以ASCII 码的次序排列(其实并不一定,还跟一些环境变量有关),并将结果输出到标准输出。关于ASCII码可以看一下百度百科里对ASCII码的介绍https://baike.baidu.com/item/ASCII
如果文本里有数字、特殊符号的呢?
[root@liang-00 ~]# head /etc/passwd >1.txt #取/etc/passwd的前十行
[root@liang-00 ~]# vim 1.txt #添加一些数字和特殊符号
[root@liang-00 ~]# sort 1.txt #进行sort排序 ------> 结果为:特殊符号排在最前边,数字紧跟其后,最后字母。
<
>
)
[
]
{
}
&
%
1111111
2122222
22222222
4444444
adm:x:3:4:adm:/var/adm:/sbin/nologin
*asda
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
halt:x:7:0:halt:/sbin:/sbin/halt
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
root:x:0:0:root:/root:/bin/bash
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
sync:x:5:0:sync:/sbin:/bin/sync
[root@liang-00 ~]#
sort -n 依照数值的大小排序。
sort -r 以相反的顺序来排序。
wc命令 用来计算数字。利用wc指令我们可以计算文件的Byte数、字数或是列数,若不指定文件名称,或是所给予的文件名为“-”,则wc指令会从标准输入设备读取数据。
参数:
- -c或--bytes或--chars 只显示Bytes数。
- -l或--lines 只显示行数。
- -w或--words 只显示字数。
直接使用 wc 命令不加任何参数。
[root@liang-00 ~]# wc anaconda-ks.cfg 129 258 4930 anaconda-ks.cfg #129为行数,258为字数,4930为字符数
-l 选项统计行数。
[root@liang-00 ~]# wc -l anaconda-ks.cfg 129 anaconda-ks.cfg [root@liang-00 ~]#
-m 选项统计字符数
[root@liang-00 ~]# wc -m 2.txt 16 2.txt [root@liang-00 ~]# cat -A 2.txt #统计为16个字符数,包括三个$换行符,一个空格。 1111$ 2222$ 33 33$ [root@liang-00 ~]#
-w 统计单词数。
[root@liang-00 ~]# wc -w 2.txt 4 2.txt [root@liang-00 ~]# cat 2.txt 1111 2222 33 33 [root@liang-00 ~]#
uniq命令 用于检查及删除文本文件中重复出现的行列。一般与sort一起使用。
参数:
- -c或——count:在每列旁边显示该行重复出现的次数;
- -d或--repeated:仅显示重复出现的行列;
- -f<栏位>或--skip-fields=<栏位>:忽略比较指定的栏位;
- -s<字符位置>或--skip-chars=<字符位置>:忽略比较指定的字符;
- -u或——unique:仅显示出一次的行列;
- -w<字符位置>或--check-chars=<字符位置>:指定要比较的字符。
uniq通常与sort一起使用,先排序在去重。
[root@liang-00 ~]# uniq 2.txt #在没有排序的情况下不没有去重。 1 2222 1 33 33 abc ccc bbb ffffff [root@liang-00 ~]# sort 2.txt |uniq #先排序,在去重。 1 2222 33 33 abc bbb ccc ffffff
-c 在每列旁边显示该行重复出现的次数。
[root@liang-00 ~]# sort 2.txt |uniq -c 2 1 1 2222 1 33 33 1 abc 1 bbb 1 ccc 1 ffffff
8.12 tee_tr_split命令
tee命令 用于读取标准输入的数据,并将其内容输出成文件,并且打印到屏幕上。
参数:
- -a:向文件中重定向时使用追加模式;
- -i:忽略中断(interrupt)信号。
将文件排序去重后,输出成文件。
[root@liang-00 ~]# sort 2.txt |uniq -c |tee a.txt #将2.txt排序去重后,输出到a.txt且打印出来。 2 1 1 2222 1 33 33 1 abc 1 bbb 1 ccc 1 ffffff [root@liang-00 ~]#
“>”后直接跟文件,表示清空该文件内容。
[root@liang-00 ~]# echo "aaaaaaaaaaaaa" > 1.txt #在1.txt内写入内容 [root@liang-00 ~]# cat 1.txt aaaaaaaaaaaaa [root@liang-00 ~]# > 1.txt #清空1.txt里面的内容 [root@liang-00 ~]# cat 1.txt [root@liang-00 ~]#
-a选项,追加到输出文件内。
[root@liang-00 ~]# sort 2.txt |uniq -c |tee -a a.txt 2 1 1 2222 1 33 33 1 abc 1 bbb 1 ccc 1 ffffff [root@liang-00 ~]# cat a.txt 2 1 1 2222 1 33 33 1 abc 1 bbb 1 ccc 1 ffffff 2 1 1 2222 1 33 33 1 abc 1 bbb 1 ccc 1 ffffff [root@liang-00 ~]#
tr命令 可以对来自标准输入的字符进行替换、压缩和删除。它可以将一组字符变成另一组字符。
参数:
- -c或--complerment:取代所有不属于第一字符集的字符;
- -d或--delete:删除所有属于第一字符集的字符;
- -s或--squeeze-repeats:把连续重复的字符以单独一个字符表示;
- -t或--truncate-set1:先删除第一字符集较第二字符集多出的字符。
将小写字符串改为大写。
[root@liang-00 ~]# echo "lianglinux" |tr '[l]' '[L]' #将字符串中的“l”改为“L”。 LiangLinux [root@liang-00 ~]# echo "lianglinux" |tr '[a-z]' '[A-Z]' #将所有小写改为大写。 LIANGLINUX [root@liang-00 ~]# echo "lianglinux" |tr '[a-zA-Z]' '1' #将所有字母改为数字“1”。 1111111111 [root@liang-00 ~]#
split命令 用于将一个文件分割成数个。该指令将大文件分割成较小的文件,在默认情况下将按照每1000行切割成一个小文件。
参数:
- -b:值为每一输出档案的大小,单位为 byte。
- -C:每一输出档中,单行的最大 byte 数。
- -d:使用数字作为后缀。
- -l:值为每一输出档的列数大小。
对一个大小为248K的文件b.txt进行切割
[root@liang-00 test]# du -sh b.txt 248K b.txt [root@liang-00 test]# split -b 1000 b.txt #切割成大小为1000b(默认为b)的文件,文件名以x开头。 [root@liang-00 test]# ls b.txt xak xav xbg xbr xcc xcn xcy xdj xdu xef xeq xfb xfm xfx xgi xgt xhe xhp xia xil xiw xjh xaa xal xaw xbh xbs xcd xco xcz xdk xdv xeg xer xfc xfn xfy xgj xgu xhf xhq xib xim xix xji xab xam xax xbi xbt xce xcp xda xdl xdw xeh xes xfd xfo xfz xgk xgv xhg xhr xic xin xiy xjj xac xan xay xbj xbu xcf xcq xdb xdm xdx xei xet xfe xfp xga xgl xgw xhh xhs xid xio xiz xjk xad xao xaz xbk xbv xcg xcr xdc xdn xdy xej xeu xff xfq xgb xgm xgx xhi xht xie xip xja xjl xae xap xba xbl xbw xch xcs xdd xdo xdz xek xev xfg xfr xgc xgn xgy xhj xhu xif xiq xjb xjm xaf xaq xbb xbm xbx xci xct xde xdp xea xel xew xfh xfs xgd xgo xgz xhk xhv xig xir xjc xjn xag xar xbc xbn xby xcj xcu xdf xdq xeb xem xex xfi xft xge xgp xha xhl xhw xih xis xjd xjo xah xas xbd xbo xbz xck xcv xdg xdr xec xen xey xfj xfu xgf xgq xhb xhm xhx xii xit xje xjp xai xat xbe xbp xca xcl xcw xdh xds xed xeo xez xfk xfv xgg xgr xhc xhn xhy xij xiu xjf xjq xaj xau xbf xbq xcb xcm xcx xdi xdt xee xep xfa xfl xfw xgh xgs xhd xho xhz xik xiv xjg xjr [root@liang-00 test]#
将切割后的文件自定义名字开头。
[root@liang-00 test]# split -b 100K b.txt a. #以a.开头。 [root@liang-00 test]# ls a.aa a.ab a.ac b.txt
-l 指定行数多少。
[root@liang-00 test]# split -l 1000 b.txt #每1000行切割成一个文件 [root@liang-00 test]# ls b.txt xaa xab xac xad xae xaf xag [root@liang-00 test]# wc -l * 6365 b.txt 1000 xaa 1000 xab 1000 xac 1000 xad 1000 xae 1000 xaf 365 xag 12730 total [root@liang-00 test]#
8.13 shell特殊符号
$ 变量前缀,!$ 组合,正则里面表示行尾。
; 多条命令写到一行,用分号分割。
[root@liang-00 test]# ls b.txt ; du -sh xaa; wc -l xac #执行多条命令用分号分割开 b.txt 40K xaa 1000 xac [root@liang-00 test]#
~ 用户家目录,正则表达式里面表示匹配符。
& 放到命令后面,会把命令丢到后台。
> 输出重定向;>> 追加重定向;2>错误输出重定向;2>>错误输出追加重定向;&>不管错误还是正确都输出。
[] 指定字符中的一个,[1-9],[a-zA-Z],[abc]。
||和&&,用在命令之间。
|| 符号
用于两条命令之间,如果第一条命令执行成功就不执行第二条命令,如果第一条命令执行不成功就执行第二条命令。
[root@liang-00 test]# wc -l b.txt || ls xaa #第一条命令执行成功了,没有执行第二条。 6365 b.txt [root@liang-00 test]# cat b1.txt || wc -l xaa #第一条没有执行成功,继续执行第二条。 cat: b1.txt: No such file or directory 1000 xaa [root@liang-00 test]#
&& 符号
用于两条命令之间,如果第一条命令执行成功才去执行第二条命令,如果第一条命令执行不成功就不执行第二条命令。
[root@liang-00 test]# cat b1.txt && wc -l xaa #第一条命令执行没成功,就不在执行第二条命令。 cat: b1.txt: No such file or directory [root@liang-00 test]# ls b.txt && wc -l xaa #第一条命令执行成功了,再执行第二条命令。 b.txt 1000 xaa [root@liang-00 test]#
|| 与 &&符号实际应用举例。
在系统中想要创建一个目录,但是不知道它存在不存在,如果存在了,就不去创建它,如果不存在再去创建它。
Linux 系统添加操作记录审计
有时候我们需要对线上用户操作记录进行历史记录待出现问题追究责任人,,但Linux系统自带的history命令用户有自行删除权限,那怎么设置可以让用户的操作记录实时记录,并保证普通用户无权删除呢?本文教你一招。
[root@liang-00 ~]# mkdir -p /usr/local/domob/records/ [root@liang-00 ~]# chmod 777 /usr/local/domob/records/ [root@liang-00 ~]# chmod +t /usr/local/domob/records/ [root@liang-00 ~]# vim /etc/profile [root@liang-00 ~]#
效果。
[root@liang-00 ~]# su - liang #切换到普通用户liang下。 Last login: Sun Nov 4 22:33:35 CST 2018 on pts/0 [liang@liang-00 ~]$ [liang@liang-00 ~]$ cd #执行一些列操作 [liang@liang-00 ~]$ ls [liang@liang-00 ~]$ df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/centos-root 28G 2.1G 26G 8% / devtmpfs 480M 0 480M 0% /dev tmpfs 492M 0 492M 0% /dev/shm tmpfs 492M 7.5M 485M 2% /run tmpfs 492M 0 492M 0% /sys/fs/cgroup /dev/sda1 197M 108M 90M 55% /boot tmpfs 99M 0 99M 0% /run/user/0 [liang@liang-00 ~]$ logout [root@liang-00 ~]# cd /usr/local/domob/records/liang/ [root@liang-00 liang]# ls bash_history #查看 /usr/local/domob/records/liang/ 下记录的 bash_history [root@liang-00 liang]# cat bash_history 2018-11-07 00:09:46 ##### root pts/0 (192.168.37.1) #### su - 2018-11-07 00:09:48 ##### root pts/0 (192.168.37.1) #### su - 2018-11-07 00:09:49 ##### root pts/0 (192.168.37.1) #### cd 2018-11-07 00:09:50 ##### root pts/0 (192.168.37.1) #### ls 2018-11-07 00:10:01 ##### root pts/0 (192.168.37.1) #### df -h 2018-11-07 00:10:02 ##### root pts/0 (192.168.37.1) #### df -h 2018-11-07 00:10:02 ##### root pts/0 (192.168.37.1) #### df -h 2018-11-07 00:10:02 ##### root pts/0 (192.168.37.1) #### df -h 2018-11-07 00:10:03 ##### root pts/0 (192.168.37.1) #### df -h 2018-11-07 00:10:03 ##### root pts/0 (192.168.37.1) #### df -h 2018-11-07 00:10:03 ##### root pts/0 (192.168.37.1) #### df -h 2018-11-07 00:10:03 ##### root pts/0 (192.168.37.1) #### df -h 2018-11-07 00:10:04 ##### root pts/0 (192.168.37.1) #### df -h
撰写本博客所用到的参考文献:
http://man.linuxde.net
http://www.runoob.com/
http://www.68idc.cn/help/server/linux/2014042190951.html
http://ask.apelearn.com/question/5437