Linux Shell基础(下)

目录

一、shell特殊符号cut命令

二、cut、sort、wc、uniq命令

三、tee、tr、split命令

四、简易审计系统

五、fork, exec, source三者执行shell脚本的区别

一、Shell特殊符号

字符 用途
换行符 启动命令的执行
; 分隔命令
( ) 通过子shell或标示函数执行命令分组
& 将命令放到后台执行
| 将前一个命令的输出发送给其后的命令(管道)
> 标准输也重定向
>> 标准输出追加重定向
< 标准输入重定向
<< Here文档
* 模糊文件引用中的零个或多个字符组成的串
? 模糊文件引用中的任意单个字符
\ 引用后面的字符
‘ (单引号) 引用字符串,阻止所有替换
“ (双引号) 引用字符串,只允许变量替换和命令替换
``(反引号) 命令替换
[ ] 模糊引用中的字符类别
$ 引用某个变量
.(内置句点) 执行命令(只在句首)
# 开始一行注释
{} 封装函数体
:(内置空串) 返回True
&&(逻辑与) 只有左边的命令成功(返回值是0),才会执行右边的命令
| | (逻辑或) 只有左边的命令失败(返回值是非0),才会执行右边的命令
!(逻辑非) 反传命令的退出状态值
$( ) 执行命令替换(推荐)
[ ] 计算算术表达式的值
  1. //分号(;)将多条命令放在同一行
  2. [root@lanquark demo]# ls;cat err.txt
  3. 1.txt 2.txt 3.txt err.txt f1.txt f2.txt ls.txt temp txt
  4. ls: cannot access bb.txt: No such file or directory
  5. //括号()通过子shell执行命令分组
  6. [root@lanquark demo]# (pwd;echo $BASH_SUBSHELL)
  7. /root/demo
  8. 1
  9. //命令放到后台执行
  10. [root@lanquark demo]# sleep 10 &
  11. [1] 3846
  12. [root@lanquark demo]# jobs
  13. [1]+ Running sleep 10 &
  14. [root@lanquark demo]#
  15. //管道符|
  16. [root@lanquark demo]# cat temp | wc -l
  17. 25
  18. //标准输出默认输出到显示器。输出重定向,输出内容不在显示器上显示,保存到指定文件中,会清空原有文件
  19. [root@lanquark demo]# ls -l > ls_demo.txt
  20. [root@lanquark demo]# cat ls_demo.txt
  21. total 24
  22. -rw-r--r-- 1 root root 4 Jun 1 07:50 1.txt
  23. -rw-r--r-- 1 root root 12 Jun 1 07:51 2.txt
  24. -rw-r--r-- 1 root root 0 Jun 2 11:02 3.txt
  25. -rw-r--r-- 1 root root 52 Jun 1 07:46 err.txt
  26. -rw-r--r--. 1 root root 16 May 21 00:58 f1.txt
  27. -rw-r--r-- 1 root root 0 May 21 19:46 f2.txt
  28. -rw-r--r-- 1 root root 0 Jun 2 11:30 ls_demo.txt
  29. -rw-r--r-- 1 root root 57 Jun 1 07:48 ls.txt
  30. -rw-r--r-- 1 root root 1146 May 25 03:44 temp
  31. -rw-r--r-- 1 root root 0 Jun 1 07:28 txt
  32. //输出追加重定
  33. [root@lanquark demo]# echo "I am new" >> ls_demo.txt
  34. [root@lanquark demo]# cat ls_demo.txt
  35. total 24
  36. -rw-r--r-- 1 root root 4 Jun 1 07:50 1.txt
  37. -rw-r--r-- 1 root root 12 Jun 1 07:51 2.txt
  38. -rw-r--r-- 1 root root 0 Jun 2 11:02 3.txt
  39. -rw-r--r-- 1 root root 52 Jun 1 07:46 err.txt
  40. -rw-r--r--. 1 root root 16 May 21 00:58 f1.txt
  41. -rw-r--r-- 1 root root 0 May 21 19:46 f2.txt
  42. -rw-r--r-- 1 root root 0 Jun 2 11:30 ls_demo.txt
  43. -rw-r--r-- 1 root root 57 Jun 1 07:48 ls.txt
  44. -rw-r--r-- 1 root root 1146 May 25 03:44 temp
  45. -rw-r--r-- 1 root root 0 Jun 1 07:28 txt
  46. I am new
  47. //标准输入重定向,默认是从键盘。
  48. [root@lanquark demo]# wc -l < /etc/passwd
  49. 25
  50. //here文档。
  51. [root@lanquark demo]# cat >>here_document.txt<<EOF
  52. > aaaaaa
  53. > bbbbbb
  54. > cccccc
  55. > EOF
  56. [root@lanquark demo]# cat here_document.txt
  57. aaaaaa
  58. bbbbbb
  59. cccccc
  60. //星号(*),匹配0个或多个任意字符
  61. [root@lanquark demo]# ls
  62. 1.txt 2.txt 3.txt err.txt f1.txt f2.txt here_document.txt ls_demo.txt ls.txt temp txt
  63. [root@lanquark demo]# ls *.txt
  64. 1.txt 2.txt 3.txt err.txt f1.txt f2.txt here_document.txt ls_demo.txt ls.txt
  65. //问号(?)匹配任意一个字符
  66. [root@lanquark demo]# ls
  67. 1.txt 2.txt 3.txt err.txt f1.txt f2.txt here_document.txt ls_demo.txt ls.txt temp txt
  68. [root@lanquark demo]# ls ?.txt
  69. 1.txt 2.txt 3.txt
  70. //反引号(\),转义后面的字符
  71. [root@lanquark demo]# echo $myname
  72. hjm
  73. [root@lanquark demo]# echo \$myname
  74. $myname
  75. //单引号所见即所得,双引号会扩展变量和命令
  76. [root@lanquark demo]# myname='hjm'
  77. [root@lanquark demo]# echo '$myname'
  78. $myname
  79. [root@lanquark demo]# echo "$myname"
  80. hjm
  81. //反引号会扩展命令,反引号伴于波浪号下(~)
  82. [root@lanquark demo]# tt=`date +%F`
  83. [root@lanquark demo]# echo $tt
  84. 2018-06-02
  85. //[ ]匹配字符类型
  86. [root@lanquark demo]# ls [123].txt
  87. 1.txt 2.txt 3.txt
  88. //$引用变量
  89. [root@lanquark demo]# domain='lanquark.com'
  90. [root@lanquark demo]# echo $domain
  91. lanquark.com
  92. //点(.),在当前shell中执行文件中的命令,只在行首
  93. [root@lanquark demo]# cat bbb.sh
  94. ls -l > lsb.txt
  95. wc -l lsb.txt
  96. [root@lanquark demo]# . bbb.sh
  97. 18 lsb.txt
  98. [root@lanquark demo]# cat lsb.txt
  99. total 44
  100. -rw-r--r-- 1 root root 4 Jun 1 07:50 1.txt
  101. -rw-r--r-- 1 root root 12 Jun 1 07:51 2.txt
  102. -rw-r--r-- 1 root root 0 Jun 2 11:02 3.txt
  103. -rw-r--r-- 1 root root 0 Jun 2 11:47 a
  104. -rw-r--r-- 1 root root 113 Jun 2 11:52 aaa.txt
  105. -rw-r--r-- 1 root root 0 Jun 2 11:47 b
  106. -rwxr-xr-x 1 root root 32 Jun 2 12:03 bbb.sh
  107. -rw-r--r-- 1 root root 52 Jun 1 07:46 err.txt
  108. -rw-r--r--. 1 root root 16 May 21 00:58 f1.txt
  109. -rw-r--r-- 1 root root 0 May 21 19:46 f2.txt
  110. -rw-r--r-- 1 root root 21 Jun 2 11:37 here_document.txt
  111. -rw-r--r-- 1 root root 0 Jun 2 12:04 lsb.txt
  112. -rw-r--r-- 1 root root 506 Jun 2 11:33 ls_demo.txt
  113. -rw-r--r-- 1 root root 57 Jun 1 07:48 ls.txt
  114. -rwxr-xr-x 1 root root 25 Jun 2 11:52 shell_demo.txt
  115. -rw-r--r-- 1 root root 1146 May 25 03:44 temp
  116. -rw-r--r-- 1 root root 0 Jun 1 07:28 txt
  117. //逻辑与&&
  118. [root@lanquark demo]# ls -l err.txt && echo "exist"
  119. -rw-r--r-- 1 root root 52 Jun 1 07:46 err.txt
  120. exist
  121. //逻辑或||
  122. [root@lanquark demo]# ls -ld fd3 || mkdir fd3
  123. ls: cannot access fd3: No such file or directory
  124. [root@lanquark demo]# ls -ld fd3
  125. drwxr-xr-x 2 root root 6 Jun 2 12:09 fd3
  126. //命令替换$(), 作用同反引号,推荐用$()
  127. [root@lanquark demo]# work_place=$(pwd)
  128. [root@lanquark demo]# echo $work_place
  129. /root/demo

二、cut、sort、wc、uniq命令

Cut可以从数据中抽取指定列或字段

cut语法:

cut -c list [file...]

cut -f list [-d delimiteer] [-s] [file...]

list是要抽取的列的列表,file是输入文件的名称

抽取列

  1. //只显示示例文件中的姓名
  2. [root@lanquark demo]# cat sample.txt
  3. 012-34-5678 Ambercrombie, A1 01/01/72 555-1111
  4. 123-45-6789 Barton, Barbara 02/02/73 555-2222
  5. 234-56-7890 Canby, charles 03/03/74 555-3333
  6. 345-67-8901 Danfield, Deam 04/04/75 555-4444
  7. [root@lanquark demo]# cut -c 14-31 sample.txt
  8. Ambercrombie, A1
  9. Barton, Barbara
  10. Canby, charles
  11. Danfield, Deam
  12. //显示姓名和电话号码
  13. [root@lanquark demo]# cut -c 14-31,46-55 sample.txt
  14. Ambercrombie, A1 555-1111
  15. Barton, Barbara 555-2222
  16. Canby, charles 555-3333
  17. Danfield, Deam 555-4444
  18. //显示每个用户登录了多少次
  19. [root@lanquark]~# who | cut -c 1-8 | sort | uniq -c
  20. 1 hjm
  21. 3 root
  22. 1 user1

抽取数据字段

  1. //抽取一个字段
  2. [root@lanquark]~# cut -f 1 -d ':' /etc/passwd
  3. root
  4. bin
  5. daemon
  6. adm
  7. lp
  8. sync
  9. shutdown
  10. halt
  11. mail
  12. operator
  13. games
  14. ftp
  15. nobody
  16. systemd-network
  17. dbus
  18. polkitd
  19. abrt
  20. tss
  21. postfix
  22. chrony
  23. sshd
  24. hjm
  25. user1
  26. user2
  27. user3
  28. //抽取多个字段
  29. [root@lanquark]~# cut -f 1,3-5 -d ':' /etc/passwd
  30. root:0:0:root
  31. bin:1:1:bin
  32. daemon:2:2:daemon
  33. adm:3:4:adm
  34. lp:4:7:lp
  35. sync:5:0:sync
  36. shutdown:6:0:shutdown
  37. halt:7:0:halt
  38. mail:8:12:mail
  39. operator:11:0:operator
  40. games:12:100:games
  41. ftp:14:50:FTP User
  42. nobody:99:99:Nobody
  43. systemd-network:192:192:systemd Network Management
  44. dbus:81:81:System message bus
  45. polkitd:999:997:User for polkitd
  46. abrt:173:173:
  47. tss:59:59:Account used by the trousers package to sandbox the tcsd daemon
  48. postfix:89:89:
  49. chrony:998:996:
  50. sshd:74:74:Privilege-separated SSH
  51. hjm:5000:5000:HJM
  52. user1:5001:100:
  53. user2:5002:100:
  54. user3:5003:100:
  55. //-f和-d之后的空格可以省略

sort可以排序数据以及查看数据是否排序。

语法: sort [-t 分隔符] [-dfnru] [-o outfile] [infile...]

outfile是存放输出文件的名称,infile是包含输入的文件的名称

-d(directory,字典)只查看字母、数字或空白符。当数据中包含可能妨碍排序过程的字符(例如标点符号时可以用这个选项)

-f(fold,等同)忽略大小写

-n(numeric,数字)选项识别行开头或者字段开头的数字,并按数字进行排序

  1. [root@lanquark]~# cat number.txt
  2. 11
  3. 2
  4. 1
  5. 20
  6. 10
  7. [root@lanquark]~# sort number.txt
  8. 1
  9. 10
  10. 11
  11. 2
  12. 20
  13. //以第4列按数字排序
  14. [root@lanquark]~/demo# cat num.sort
  15. root:x:0:0:root:/root:/bin/bash
  16. bin:x:1:1:bin:/bin:/sbin/nologin
  17. daemon:x:2:2:daemon:/sbin:/sbin/nologin
  18. adm:x:3:4:adm:/var/adm:/sbin/nologin
  19. lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
  20. [root@lanquark]~/demo# sort -t ':' -n -k4 num.sort
  21. root:x:0:0:root:/root:/bin/bash
  22. bin:x:1:1:bin:/bin:/sbin/nologin
  23. daemon:x:2:2:daemon:/sbin:/sbin/nologin
  24. adm:x:3:4:adm:/var/adm:/sbin/nologin
  25. lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

-r(reverse,反向)按反向顺序对数据排序

  1. [root@lanquark]~/demo# cat number.txt
  2. 11
  3. 2
  4. 1
  5. 20
  6. 10
  7. [root@lanquark]~/demo# sort -nr number.txt
  8. 20
  9. 11
  10. 10
  11. 2
  12. 1

-u 查找相同的行,并将相同的行只留下一行

  1. [root@lanquark]~/demo# cat s_unic.txt
  2. Barbara
  3. AI
  4. Barbara
  5. Barbara
  6. Dave
  7. [root@lanquark]~/demo# sort -u s_unic.txt
  8. AI
  9. Barbara
  10. Dave

检查数据是否有序(sort -c)

  1. [root@lanquark]~/demo# cat number.txt
  2. 11
  3. 2
  4. 1
  5. 20
  6. 10
  7. [root@lanquark]~/demo# sort -c number.txt
  8. sort: number.txt:3: disorder: 1

ASCII码排序

sort排序的结果取决于系统中字符的组织方式。

建议采用ASCII字符编码方式排序。

ASCII码排序三个基本原则

1.空格在数字前面

2.数字在大写字母前

3.大写字母在小写字母前面

可以通过设置环境变量LC_COLLATE的值来保证使用ASCII排序

  1. [root@lanquark]~/demo# locale | grep LC_COLLATE
  2. LC_COLLATE="en_US.UTF-8"
  3. [root@lanquark]~/demo# echo 'export LC_COLLATE=C' >> /etc/profile
  4. [root@lanquark]~/demo# . /etc/profile
  5. [root@lanquark]~/demo# locale | grep LC_COLLATE
  6. LC_COLLATE=C

wc 统计行、单词和字符数量

语法:wc [-clLw] [file...]

不带选项的wc命令统计文件的字符数、单词数和行数

  1. [root@lanquark]~/demo# cat poem
  2. There was a young man from Nantucket,
  3. Whose girlfriend had told him to
  4. [root@lanquark]~/demo# wc poem
  5. 2 13 71 poem
  6. //"字符"就是字母、数字、标点符号、空格、制表符或者新行字符
  7. //"单词"就是一串连续的字符,用空格、制表符或新行字符分隔
  8. //"行"就是以新行字符结尾的一串字符

-c 统计字符

  1. [root@lanquark]~/demo# wc -c poem
  2. 71 poem

-l 统计行数

  1. [root@lanquark]~/demo# wc -l poem
  2. 2 poem
  3. [root@lanquark]~/demo# who
  4. user1 tty1 2018-06-02 12:40
  5. root pts/0 2018-06-01 00:02 (192.168.1.9)
  6. root pts/1 2018-06-01 07:25 (192.168.1.9)
  7. root pts/2 2018-06-02 12:39 (192.168.1.9)
  8. hjm tty2 2018-06-02 12:40
  9. [root@lanquark]~/demo# who | wc -l
  10. 5

-w 统计单词数

  1. [root@lanquark]~/demo# wc -w poem
  2. 13 poem

-L 统计该文件中最长行的长度

  1. [root@lanquark]~/demo# wc -L poem
  2. 37 poem

uniq 一行一行地检查数据,查找连续重复的行

语法:uniq [-cdu] [infile] [outfile]

不带选项的uniq去除重复行的

  1. [root@lanquark]~/demo# cat data
  2. AI
  3. AI
  4. Barbara
  5. Barbara
  6. Charles
  7. [root@lanquark]~/demo# uniq data
  8. AI
  9. Barbara
  10. Charles
  11. //注意:uniq的输入必须是有序的,所以重复行不连续的

-d 只查看重复行

  1. [root@lanquark]~/demo# uniq -d data
  2. AI
  3. Barbara

-c 统计重复行出现的次数

  1. [root@lanquark]~/demo# uniq -c data
  2. 2 AI
  3. 2 Barbara
  4. 1 Charles

-u 只查看非重复的行

  1. [root@lanquark]~/demo# uniq -u data
  2. Charles

三、tee、tr、split命令

tee 管道线分流,将程序的输出发送到两个地方,类似于水管的双通头。

tee的作用就是从标准输入读取数据,并向标准输出和一个文件各发送一份数据。

语法: tee [-a] file....

  1. [root@lanquark]~/demo# who | tee status
  2. user1 tty1 2018-06-02 12:40
  3. root pts/0 2018-06-01 00:02 (192.168.1.9)
  4. root pts/1 2018-06-01 07:25 (192.168.1.9)
  5. root pts/2 2018-06-02 12:39 (192.168.1.9)
  6. hjm tty2 2018-06-02 12:40
  7. [root@lanquark]~/demo# cat status
  8. user1 tty1 2018-06-02 12:40
  9. root pts/0 2018-06-01 00:02 (192.168.1.9)
  10. root pts/1 2018-06-01 07:25 (192.168.1.9)
  11. root pts/2 2018-06-02 12:39 (192.168.1.9)
  12. hjm tty2 2018-06-02 12:40

-a (append) 追加到某文件

  1. [root@lanquark]~/demo# netstat -nltup | tee -a status
  2. Active Internet connections (only servers)
  3. Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
  4. tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1143/sshd
  5. tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1245/master
  6. tcp6 0 0 :::22 :::* LISTEN 1143/sshd
  7. tcp6 0 0 ::1:25 :::* LISTEN 1245/master
  8. udp 0 0 127.0.0.1:323 0.0.0.0:* 734/chronyd
  9. udp6 0 0 ::1:323 :::* 734/chronyd
  10. [root@lanquark]~/demo# cat status
  11. user1 tty1 2018-06-02 12:40
  12. root pts/0 2018-06-01 00:02 (192.168.1.9)
  13. root pts/1 2018-06-01 07:25 (192.168.1.9)
  14. root pts/2 2018-06-02 12:39 (192.168.1.9)
  15. hjm tty2 2018-06-02 12:40
  16. Active Internet connections (only servers)
  17. Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
  18. tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1143/sshd
  19. tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1245/master
  20. tcp6 0 0 :::22 :::* LISTEN 1143/sshd
  21. tcp6 0 0 ::1:25 :::* LISTEN 1245/master
  22. udp 0 0 127.0.0.1:323 0.0.0.0:* 734/chronyd
  23. udp6 0 0 ::1:323 :::* 734/chronyd

tr 转换字符

tr可以对字符执行三种不同操作。

1.将字符改变成其他字符

2.如果要转换的字符连续出现不止一次,则用一个单独的字符替换,实现去重的效果

3.删除指定字符

常用语法: tr [-cds] [set1 [set2]]

set1和set2是字符组

转换字符

  1. [root@lanquark]~/demo# head -n5 temp > str_sample
  2. [root@lanquark]~/demo# cat str_sample
  3. root:x:0:0:root:/root:/bin/bash
  4. bin:x:1:1:bin:/bin:/sbin/nologin
  5. daemon:x:2:2:daemon:/sbin:/sbin/nologin
  6. adm:x:3:4:adm:/var/adm:/sbin/nologin
  7. lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
  8. [root@lanquark]~/demo# tr 'root' 'ROOT' < str_sample
  9. ROOT:x:0:0:ROOT:/ROOT:/bin/bash
  10. bin:x:1:1:bin:/bin:/sbin/nOlOgin
  11. daemOn:x:2:2:daemOn:/sbin:/sbin/nOlOgin
  12. adm:x:3:4:adm:/vaR/adm:/sbin/nOlOgin
  13. lp:x:4:7:lp:/vaR/spOOl/lpd:/sbin/nOlOgin
  14. //如需保存替换后的文件,可将转出重定向到某个文件中
  15. [root@lanquark]~/demo# tr 'root' 'ROOT' < str_sample > new
  16. [root@lanquark]~/demo# cat new
  17. ROOT:x:0:0:ROOT:/ROOT:/bin/bash
  18. bin:x:1:1:bin:/bin:/sbin/nOlOgin
  19. daemOn:x:2:2:daemOn:/sbin:/sbin/nOlOgin
  20. adm:x:3:4:adm:/vaR/adm:/sbin/nOlOgin
  21. lp:x:4:7:lp:/vaR/spOOl/lpd:/sbin/nOlOgin
  22. //定义字符范围
  23. [root@lanquark]~/demo# tr a-z A-Z < str_sample
  24. ROOT:X:0:0:ROOT:/ROOT:/BIN/BASH
  25. BIN:X:1:1:BIN:/BIN:/SBIN/NOLOGIN
  26. DAEMON:X:2:2:DAEMON:/SBIN:/SBIN/NOLOGIN
  27. ADM:X:3:4:ADM:/VAR/ADM:/SBIN/NOLOGIN
  28. LP:X:4:7:LP:/VAR/SPOOL/LPD:/SBIN/NOLOGIN
  29. //转换不可显示字符
  30. [root@lanquark]~/demo# cat str_sample
  31. root:x:0:0:root:/root:/bin/bash
  32. bin:x:1:1:bin:/bin:/sbin/nologin
  33. daemon:x:2:2:daemon:/sbin:/sbin/nologin
  34. adm:x:3:4:adm:/var/adm:/sbin/nologin
  35. lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
  36. [root@lanquark]~/demo# tr '\n' '\t'< str_sample
  37. 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 #

-s 将多个连续字符替换为一个单独的字符。

  1. [root@lanquark]~/demo# cat data1
  2. rootxxx0x0xrootx/rootx/bin/bash
  3. binxxxxxxxbinx/binx/sbin/nologin
  4. daemonxxxxxxxdaemonx/sbinx/sbin/nologin
  5. admxxxxxxxadmx/var/admx/sbin/nologin
  6. lpxxxxxxxlpx/var/spool/lpdx/sbin/nologin
  7. [root@lanquark]~/demo# tr -s x '#' < data1
  8. //将连续的x替换为一个#
  9. root#0#0#root#/root#/bin/bash
  10. bin#bin#/bin#/sbin/nologin
  11. daemon#daemon#/sbin#/sbin/nologin
  12. adm#adm#/var/adm#/sbin/nologin
  13. lp#lp#/var/spool/lpd#/sbin/nologin

-d 删除指定字符

  1. //删除所有的:号
  2. [root@lanquark]~/demo# cat str_sample
  3. root:x:0:0:root:/root:/bin/bash
  4. bin:x:1:1:bin:/bin:/sbin/nologin
  5. daemon:x:2:2:daemon:/sbin:/sbin/nologin
  6. adm:x:3:4:adm:/var/adm:/sbin/nologin
  7. lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
  8. [root@lanquark]~/demo# tr -d ':' < str_sample
  9. rootx00root/root/bin/bash
  10. binx11bin/bin/sbin/nologin
  11. daemonx22daemon/sbin/sbin/nologin
  12. admx34adm/var/adm/sbin/nologin
  13. lpx47lp/var/spool/lpd/sbin/nologin
  14. //删除所有的数字
  15. [root@lanquark]~/demo# tr -d 0-9 <str_sample
  16. root:x:::root:/root:/bin/bash
  17. bin:x:::bin:/bin:/sbin/nologin
  18. daemon:x:::daemon:/sbin:/sbin/nologin
  19. adm:x:::adm:/var/adm:/sbin/nologin
  20. lp:x:::lp:/var/spool/lpd:/sbin/nologin

split 将一个大文件划分成几个小文件

语法 split [-d] [-a num] [-l lines] [file[prefix]]

默认情况下,split创建1000行长的文件

-b 根据文件大小来分割文档,默认单位为byte(字节)

  1. [root@lanquark]~/demo# ls -lh system.log
  2. -rwxr-x--- 1 root root 6.2M Jun 2 15:57 system.log
  3. [root@lanquark]~/demo# wc -l system.log
  4. 6455 system.log
  5. //以1M为单位分割system.log
  6. //1M=1024b*1024b
  7. [root@lanquark]~/demo# split -b 1048576 system.log
  8. [root@lanquark]~/demo# ls -lh xa*
  9. -rw-r--r-- 1 root root 1.0M Jun 2 16:03 xaa
  10. -rw-r--r-- 1 root root 1.0M Jun 2 16:03 xab
  11. -rw-r--r-- 1 root root 1.0M Jun 2 16:03 xac
  12. -rw-r--r-- 1 root root 1.0M Jun 2 16:03 xad
  13. -rw-r--r-- 1 root root 1.0M Jun 2 16:03 xae
  14. -rw-r--r-- 1 root root 1.0M Jun 2 16:03 xaf
  15. -rw-r--r-- 1 root root 108K Jun 2 16:03 xag
  16. //指定分割后产生文件名的开头为000
  17. [root@lanquark]~/demo# split -b 1048576 system.log 000
  18. [root@lanquark]~/demo# ls -l 000*
  19. -rw-r--r-- 1 root root 1048576 Jun 2 16:08 000aa
  20. -rw-r--r-- 1 root root 1048576 Jun 2 16:08 000ab
  21. -rw-r--r-- 1 root root 1048576 Jun 2 16:08 000ac
  22. -rw-r--r-- 1 root root 1048576 Jun 2 16:08 000ad
  23. -rw-r--r-- 1 root root 1048576 Jun 2 16:08 000ae
  24. -rw-r--r-- 1 root root 1048576 Jun 2 16:08 000af
  25. -rw-r--r-- 1 root root 110592 Jun 2 16:08 000ag

-l以行为单位分割文件

  1. [root@lanquark]~/demo# wc -l system.log
  2. 6455 system.log
  3. //以2000行为单位分割system.log
  4. [root@lanquark]~/demo# split -l 2000 system.log
  5. [root@lanquark]~/demo# ll -h xa*
  6. -rw-r--r-- 1 root root 461K Jun 2 16:13 xaa
  7. -rw-r--r-- 1 root root 452K Jun 2 16:13 xab
  8. -rw-r--r-- 1 root root 801K Jun 2 16:13 xac
  9. -rw-r--r-- 1 root root 4.5M Jun 2 16:13 xad
  10. //指定分割后产生文件名的开头为000
  11. [root@lanquark]~/demo# ll -h 000*
  12. -rw-r--r-- 1 root root 461K Jun 2 16:14 000aa
  13. -rw-r--r-- 1 root root 452K Jun 2 16:14 000ab
  14. -rw-r--r-- 1 root root 801K Jun 2 16:14 000ac
  15. -rw-r--r-- 1 root root 4.5M Jun 2 16:14 000ad

四、简易审计系统

1.新建记录存放目录

  1. [root@lanquark]~/demo# mkdir -p /usr/local/syslog/records/
  2. [root@lanquark]~/demo# chmod 777 /usr/local/syslog/records
  3. [root@lanquark]~/demo# chmod +t /usr/local/syslog/records
  4. [root@lanquark]~/demo# ll -d /usr/local/syslog/records
  5. drwxrwxrwt 2 root root 6 Jun 2 16:24 /usr/local/syslog/records

2.在/etc/profile里添加如下内容

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

3.测试结果

在一个终端执行的命令可实时在记录文件中查看。

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

1.fork 我们所执行的任何程序,都是父进程 (parent process) 产生的一个子进程 (child process), 子进程在结束后,将返回到父进程去。 此现象在 Linux 中被称为fork。当子进程被产生的时候,将会从父进程那里获得一定的资源分配、及 (更重要的是) 继承父进程的环境。环境变量只能从父进程到子进程单向传递。 换句话说:在子进程中环境如何变更,均不会影响父进程的环境。

shell 脚本就是将你平时在 shell prompt 输入的多行 command line, 依序输入到一个文件文件而已。当我们执行一个 shell script 时,其实是先产生一个 sub-shell, 然后 sub-shell 再去产生命令行的子进程。子shell运行时,父shell处于休眠状态。子shell执行完会唤醒父进程,子shell对环境变量的修改不会影响到你shell。

2.source :就是让shell脚本在当前shell内执行,而不是产生一个子shell。执行完子进程命令后继续执行父进程命令,子进程设置的环境变量会反应到父进程的环境中。

3.exec 与source类似,但是子进程执行完,不会继续执行父进程中的命令。

验证

  1. //1.sh
  2. [root@lanquark ~]# cat 1.sh
  3. #!/bin/bash
  4. A=B
  5. echo "PID for 1.sh before exec/source/fork is:$$"
  6. export A
  7. echo "1.sh:\$A is $A"
  8. case $1 in
  9. exec)
  10. echo "using exec..."
  11. exec ./2.sh;;
  12. source)
  13. echo "using source..."
  14. . ./2.sh;;
  15. *)
  16. echo "using fork by default..."
  17. ./2.sh;;
  18. esac
  19. echo "1.sh:\$A is $A"
  20. //2.sh
  21. [root@lanquark ~]# cat 2.sh
  22. #!/bin/bash
  23. echo "PID for 2.sh is:$$"
  24. echo "2.sh get \$A=$A from 1.sh"
  25. export A=C
  26. echo "2.sh:\$A is $A"
  27. //在1.sh中以fork方式执行2.sh
  28. [root@lanquark ~]# ./1.sh fork
  29. PID for 1.sh before exec/source/fork is:27181
  30. 1.sh:$A is B
  31. using fork by default...
  32. //说明2.sh不是在1.sh同一个shell中执行,进程id不相同
  33. PID for 2.sh is:27182
  34. //子shell继承父shell的环境,所以$A=B
  35. 2.sh get $A=B from 1.sh
  36. //子shell中修改A的值
  37. 2.sh:$A is C
  38. //子shell环境变量改变不影响父shell
  39. 1.sh:$A is B
  40. //在1.sh以exec方式执行2.sh
  41. [root@lanquark ~]# ./1.sh exec
  42. PID for 1.sh before exec/source/fork is:27495
  43. 1.sh:$A is B
  44. using exec...
  45. //和父进程的进程ID相同,说明没有产生子shell
  46. PID for 2.sh is:27495
  47. 2.sh get $A=B from 1.sh
  48. 2.sh:$A is C
  49. //2.sh执行完以后没有回退到1.sh。并且1.sh中的最后一条语句没有执行
  50. //在1.sh以source执行2.sh
  51. [root@lanquark ~]# ./1.sh source
  52. PID for 1.sh before exec/source/fork is:27670
  53. 1.sh:$A is B
  54. using source...
  55. //和父进程的进程ID相同,说明没有产生子shell
  56. PID for 2.sh is:27670
  57. 2.sh get $A=B from 1.sh
  58. //在子进程中修改了A的值
  59. 2.sh:$A is C
  60. //子进程中的修改反映到了父进程中
  61. 1.sh:$A is C

参考

https://my.oschina.net/u/3708120/blog/1799467

http://blog.51cto.com/13646023/2105163

http://blog.51cto.com/13646023/2105592

http://ask.apelearn.com/question/7719

http://www.joshstaiger.org/archives/2005/07/bash_profile_vs.html

http://ask.apelearn.com/question/5437

http://www.cnblogs.com/lr-ting/archive/2013/02/28/2936792.html

http://alsww.blog.51cto.com/2001924/1113112

http://ask.apelearn.com/question/7720

http://ask.apelearn.com/question/5364

http://ask.apelearn.com/question/5360

http://ask.apelearn.com/question/283

http://ask.apelearn.com/question/909

http://blog.csdn.net/zenghui08/article/details/7938975

https://github.com/wzb56/13_questions_of_shell

http://www.linuxnote.org/prompt_command-environment-variables.html

Linux Shell基础(下)的更多相关文章

  1. Linux shell基础知识(上)

    Linux shell基础知识(上) 目录 一.shell介绍 二.命令历史 三.命令补全和别名 四.通配符 五.输入输出重定向 六.管道符和作业控制 七.shell变量 八.环境变量配置文件 九.b ...

  2. linux shell 基础 使用日志与心得

    linux shell 基础 使用日志与心得 1.#!/bin/bash 第一行就出现#!/bin/bash是指此脚本使用/bin/bash来解释执行.其中,#!是一个特殊的表示符,其后,跟着解释此脚 ...

  3. Linux Shell 基础知识(一)

    1. 本文知识结构 2. shell 基础知识 2.1 shell 简单介绍 ​ GNU bash shell 能提供对 Linux 系统的交互式访问,一般来说,使用快捷键 Ctrl + Alt + ...

  4. linux shell基础语法

    1.第一个Shell脚本 打开文本编辑器,新建一个文件,扩展名为sh(sh代表shell),扩展名并不影响脚本执行,见名知意就好,如果你用php写shell 脚本,扩展名就用php好了. 输入一些代码 ...

  5. Linux shell基础

    shell是核心程序kernel之外的指令解析器,是一个程序,同事是一种命令语言和程序设计语言 --shell是命令解析器,用户输入命令,它去解析. shell类型 ash,bash,ksh,csh, ...

  6. Linux Shell基础 环境变量配置文件

    source命令:使环境变量配置文件强制生效 source 命令会强制执行脚本中的全部命令,而忽略脚本文件的权限.该命令主要用于让重新配置的环境变量配置文件强制生效.source 命令格式如下: [r ...

  7. Linux Shell基础 位置参数变量、预定义变量

    位置参数变量 在 Linux 的命令行中,当一条命令或脚本执行时,后面可以跟多个参数,我们使用位置参数变量来表示这些参数.其中,$0 代表命令行本身,$1 代表第 1 个参数,$2 代表第 2 个参数 ...

  8. Linux Shell基础知识

    一.文件系统和安全 chmod命令 chmod命令有两种模式,一种是符号模式,用ugo执行用户,用rwx执行权限:另一种是绝对模式,用八进制不同位置的不同值来代表不同用户的不同权限. 符号模式 chm ...

  9. Linux shell 基础

    目录 一.shell脚本的基本使用 1.语言规范 2.变量 3.重定向(>,>>) 二.运算符和常用判断 1.比较运算符 2.逻辑运算符 3.常用判断 三.程序结构 1.分支(if语 ...

随机推荐

  1. 大堆文字不如几张图片-论信息传递的方式以NodeMCU入门为例

  2. nginx的启动、停止、重载配置、验证配置

    [1]启动 启动nginx系统方式: (1)命令 nginx -c /usr/local/nginx/conf/nginx.conf 说明:-c 参数指定运行nginx系统的自定义配置文件. 若加:使 ...

  3. spring 获取对象的注解

    BeanDefinition definition = registry.getBeanDefinition(name); if (definition instanceof AnnotatedBea ...

  4. oracle(2)

    create table aaa( id number, name varchar2(100) ); select decode((select max(id) from aaa),null,'x', ...

  5. 调用WebService的简单方法

    package com.xxx.webservice.internal.test; import java.net.MalformedURLException; import java.net.URL ...

  6. python中多继承C3算法研究

    在python的面向对象继承问题中,单继承简单易懂,全部接受传承类的属性,并可添加自带属性, 但是,在多继承情况下,会遇到多个被继承者的顺序问题,以及多次继承后查找前几次继承者需求属性时,可能不易发现 ...

  7. 单元测试系列之四:Sonar平台中项目主要指标以及代码坏味道详解

    更多原创测试技术文章同步更新到微信公众号 :三国测,敬请扫码关注个人的微信号,感谢! 原文链接:http://www.cnblogs.com/zishi/p/6766994.html 众所周知Sona ...

  8. zabbix链接规则

    通过磁盘  Disk for discovery    custom.vfs.dev.discovery 配置自动发现参考

  9. P3601 签到题

    思路 注意到求的qiandao(x)就是\(x-\phi(x)\) 但是\(l,r\le 10^{12}\),所以不能直接杜教筛 但是\(r-l\le 10^{6}\),所以可以先筛出1e6(\(\s ...

  10. 【Ruby】【环境搭建】macOS Sierra 10.12.6 + Xcode 8 + gpg 2.2.8 + rvm 1.29.3 + Ruby 2.4.0 + RubyMine 2018.1.4

      按出场顺序: macOS Sierra 10.12.6  +  Xcode 8 + gpg 2.2.8 + rvm 1.29.3 +  Ruby 2.4.0 + RubyMine 2018.1.4 ...