1、cut命令
主要掌握,-d、-f、-c参数,
-c参数:-cn截取第n个字符;-c-n截取第一个掉第n个字符;-cn-截取第n个到最后一个字符。
2、sort命令
常用参数:-n、-r、-k、-t
指定分隔符第几段排序用-t和-k
[root@liang-00 test]# sort -t: -k5 /etc/passwd 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 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 sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/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 systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin dbus:x:81:81:System message bus:/:/sbin/nologin polkitd:x:999:998:User for polkitd:/:/sbin/nologin chrony:x:998:996::/var/lib/chrony:/sbin/nologin postfix:x:89:89::/var/spool/postfix:/sbin/nologin
3、wc命令
常用参数有:-l、-m、-w、-L
其中 -L 选项为统计字符串长度,与-m区别在于不统计$换行符。
用wc -l 给一个变量赋值时不能直接n=`wc -l filename` ,因为 wc -l 的结果是有两段组成,这是我们就可以用awk截取。
4、uniq命令
一般与sort结合一起用。
5、tee命令
写入文件,且打印到屏幕上。
6、tr命令
替换字符命令
7、split命令
切割文档,常用参数:-b、-l,也可以定义切割后文件的前缀。
8、Shell特殊符号
$--正则表达式中表示结尾。
;多个命令写到一行。
|| 和&& 逻辑判断。
8、echo 显示颜色
shell脚本中echo显示内容带颜色显示,echo显示带颜色,需要使用参数-e
格式如下:
echo -e "\033[字背景颜色;文字颜色m 字符串 \033[0m"
9、fork、source和exec
fork ( /directory/script.sh) :如果shell中包含执行命令,那么子命令并不影响父级的命令,在子命令执行完后再执行父级命令。子级的环境变量不会影响到父级。
exec (exec /directory/script.sh):执行子级的命令后,不再执行父级命令。
source (source /directory/script.sh):执行子级命令后继续执行父级命令,同时子级设置的环境变量会影响到父级的环境变量。
实验:
[root@liang-00 test]# cat 2.sh
#!/bin/bash
echo "children script PID is $$"
echo "now to children script."
export a=2
echo "in children, a=$a"
[root@liang-00 test]# cat source.sh
#!/bin/bash
echo "father script PID is $$"
echo "father script, set a is 1"
export a=1
echo "it will source ./2.sh"
source ./2.sh
echo "now to father script."
echo "father script, a is $a"
[root@liang-00 test]# cat exec.sh
#!/bin/bash
echo "father script PID is $$"
echo "father script, set a is 1"
export a=1
echo "it will exec ./2.sh"
exec ./2.sh
echo "father script, a is $a"
sh source.sh文件后结果为:在source.sh中执行了2.sh文件后继续执行source.sh,且把原来source.sh文件中的环境变量 a=1 变成了2.sh中的 a=2 了。
sh exec.sh文件的结果为:在exec.sh文件中执行2.sh文件后并没有继续执行exec.sh,且把原来exec.sh文件中的环境变量 a=1 变成了2.sh中的 a=2 了。
10、简易审计系统
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
PROMPT_COMMAND:在执行一条命令之前就会先执行 $PROMPT_COMMAND
以上案例中的各条命令的意思:
date:系统日期时间显示
[root@liang-00 test]# date Thu Nov 8 16:51:37 CST 2018 [root@liang-00 test]# date "+%Y-%m-%d %T" 2018-11-08 16:51:56 [root@liang-00 test]#
$(who am i |awk "{print \$1\" \"\$2\" \"\$5}")
who am i 命令
[root@liang-00 test]# who am i root pts/0 2018-11-08 16:17 (192.168.37.1)
awd后的内容为截取1、3、5段内容。
$(history 1 | { read x cmd; echo "$cmd"; })
history 1命令
命令历史的最后一条命令
[root@liang-00 test]# history 1 1857 history 1
11、关于排序出现的小问题
在对文件内容排序时出现的不按 ASCII 码顺序排的,需要把变量 LC_ALL 赋值为 C,即:LC_ALL=C。