1. 设置字体颜色
echo -e 特殊字符穿特殊处理
echo -n 最后不自动换行
\033 可以用 \e 代替
#!/bin/bash
#
#下面是字体输出颜色及终端格式控制
#字体色范围:30-37
echo -e "\033[30m 黑色字 \033[0m"
echo -e "\033[31m 红色字 \033[0m"
echo -e "\033[32m 绿色字 \033[0m"
echo -e "\033[33m 黄色字 \033[0m"
echo -e "\033[34m 蓝色字 \033[0m"
echo -e "\033[35m 紫色字 \033[0m"
echo -e "\033[36m 天蓝字 \033[0m"
echo -e "\033[37m 白色字 \033[0m"
#字背景颜色范围:40-47
echo -e "\033[40;37m 黑底白字 \033[0m"
echo -e "\033[41;30m 红底黑字 \033[0m"
echo -e "\033[42;34m 绿底蓝字 \033[0m"
echo -e "\033[43;34m 黄底蓝字 \033[0m"
echo -e "\033[44;30m 蓝底黑字 \033[0m"
echo -e "\033[45;30m 紫底黑字 \033[0m"
echo -e "\033[46;30m 天蓝底黑字 \033[0m"
echo -e "\033[47;34m 白底蓝字 \033[0m"
#控制选项说明
#\033[0m 关闭所有属性
#\033[1m 设置高亮度
#\033[4m 下划线
echo -e "\033[4;31m 下划线红字 \033[0m"
#闪烁
echo -e "\033[5;34m 红字在闪烁 \033[0m"
#反影
echo -e "\033[8m 消隐 \033[0m "
#\033[30m-\033[37m 设置前景色
#\033[40m-\033[47m 设置背景色
#\033[nA光标上移n行
#\033[nB光标下移n行
echo -e "\033[4A 光标上移4行 \033[0m"
#\033[nC光标右移n行
#\033[nD光标左移n行
#\033[y;xH设置光标位置
#\033[2J清屏
#\033[K清除从光标到行尾的内容
echo -e "\033[K 清除光标到行尾的内容 \033[0m"
#\033[s 保存光标位置
#\033[u 恢复光标位置
#\033[?25| 隐藏光标
#\033[?25h 显示光标
echo -e "\033[?25l 隐藏光标 \033[0m"
echo -e "\033[?25h 显示光标 \033[0m"
echo -n "不自动换行"
2.shell脚本中预定义变量
$# :命令行中位置参数的个数
$* :所有位置参数的内容
$? :上一条命令执行后返回的状态,当返回状态值为0时表示执行正常,非0表示执行异常或出错
$$ :当前所在进程的进程号
$! :后台运行的最后一个进程号
$0 :当前执行的进程/程序名
$1 : 位置参数第一个,以此类推
3.输入输出
read -p 打印提示(text),等待输入,并将输入存储在REPLY中
read -t 指定读取等待时间
stty -echo 禁止将输出发送到终端
stty echo 允许输出发送到终端
4.数组
定义数组格式:array[key]=value
array_pt=( 1 2 3 4 5 6 )
echo ${array_pt[0]}
echo ${array_pt[*]} 或者 echo ${array_pt[@]} 打印所有值
echo ${#array_pt[*]} 打印数组长度
unset array_pt[0] 删除第一个
unset array_pt 删除整个数组
关联数组
declare -A array 关联数组索引值可以使用任意文本
echo ${!array[*]} 打印索引值
字串提取
echo ${arr[*]:2} 从第二个开始打印
echo ${arr[*]:1:2} 打印第一个到第二个和:0:2一样
字串删除
array=( [0]=one [1]=two [2]=three [3]=four )
echo ${arr[*]#t*e} 左边开始最短匹配
one two e four
echo ${arr[*]##t*e} 左边开始最长匹配
one two four
echo ${arr[*]%o} 右边开始最短匹配
one tw three four
echo ${arr[*]%%o} 右边开始最长匹配
one tw three four
字串替换
echo ${arr[*]/o/m} m替换o
mne twm three fmur
echo ${arr[*]/o/} 删除o
ne tw three fur
echo ${arr[*]/#o/k} 第一个字母为o的替换为k
kne two three four
echo ${arr[*]/%o/k} 末尾字幕为o的替换为k
one twk three four
5.函数
a)格式
function name() {
command sequence(命令序列);
}
或
name() {
Command sequence(命令序列);
}
b) fork炸弹
:(){:|:&};:
6.Find 查找
全局查找
find / -name *.cpp
find 路径 参数
find . -iregex ".*\(\.txt\|\.pdf\)$" -i 忽略大小写 找出后缀.txt .pdf 的文件
find . -type f -name “*.txt” 找出名字为*.txt 的文件
find . -type f 时间戳 find . -type f -atime -7 访问小于七天的文件
访问时间(-atime/天,-amin/分钟):用户最近一次访问时间。
修改时间(-mtime/天,-mmin/分钟):文件最后一次修改时间。
变化时间(-ctime/天,-cmin/分钟):文件数据元(例如权限等)最后一次修 改时间。
find . -type f -size 文件大小单元
find . -type f -name "*.txt" -delete 删除
find . -type f -perm 777 权限为777的文件
find . -type f -user tom 用户名为tom所拥有的文件
find . -type f -user root -exec chown tom {} \; 查找并修改权限
find . -type f -name "*.txt" -exec printf "File: %s\n" {} \;
find . -path "./sk" -prune -o -name "*.txt" -print 搜索并跳过指定文件
7.xargs 参数传递过滤器
echo "nameXnameXnameXname" | xargs -dX -n2 -dX //定界符 -n2 两个一行
cat arg.txt | xargs -I {} echo $* adfadf {} dfadsfd -I 替换字符串
adfadf aaa dfadsfd
adfadf bbb dfadsfd
adfadf ccc dfadsfd
rm 删除太多的文件时,可能得到一个错误信息:/bin/rm Argument list too long. 用 xargs去避免这个问题:
find . -type f -name “*.log” -print0 | xargs -0 rm -f
统计一个源代码目录中所有php文件的行数:
find . -type f -name "*.php" -print0 | xargs -0 wc -l
查找所有的jpg 文件,并且压缩它们:
find . -type f -name “*jpg” | xargs tar -czvf images.tar.gz
一个文件包含了很多你希望下载的URL,你能够使用xargs下载所有链接:
cat url_list.txt | xargs wget -c
8.tr 替换
大小写转换
echo "HELLO WORLD" | tr 'A-Z' 'a-z' hello world
删除字符串
echo "hello 123 world 456" | tr -d '0-9'
hello world
将制表符转换为空格:
cat text | tr '\t' ' '
字符集补集,从输入文本中将不在补集中的所有字符删除:
echo aa.,a 1 b#$bb 2 c*/cc 3 ddd 4 | tr -d -c '0-9 \n'
1 2 3 4
用tr压缩字符,可以压缩输入中重复的字符:
echo "thissss is a text linnnnnnne." | tr -s ' sn'
this is a text line.
使用tr做数字相加操作:
echo 1 2 3 4 5 6 7 8 9 | xargs -n1 | echo $[ $(tr '\n' '+') 0 ]
tr可以使用的字符类:
[:alnum:]:字母和数字
[:alpha:]:字母
[:cntrl:]:控制(非打印)字符
[:digit:]:数字
[:graph:]:图形字符
[:lower:]:小写字母
[:print:]:可打印字符
[:punct:]:标点符号
[:space:]:空白字符
[:upper:]:大写字母
[:xdigit:]:十六进制字符
9. Sort 分类
$ sort -t ' ' -k 1.2,1.2 -nrk 3,3 facebook.txt
baidu 100 5000
google 110 5000
sohu 100 4500
guge 50 3000
-n 按字母顺序排序
-t 空格
-k 分栏
-r 与-n相反
1.2,1.2 第一个域的第二个值到第一个域的第二个值
3,3 第三个域(如果没有后面的3,会对应第3个域和其后的域)
删除重复行:
uniq file.txt
sort file.txt | uniq
sort -u file.txt
只显示单一行:
uniq -u file.txt
sort file.txt | uniq -u
统计各行在文件中出现的次数:
sort file.txt | uniq -c
在文件中找出重复的行:
sort file.txt | uniq -d
10. % 与%%与#与##
示例2,定义变量 url="man.linuxde.net"
echo ${url%.*} #移除 .* 所匹配的最右边的内容。
man.linuxde
echo ${url%%.*} #将从右边开始一直匹配到最左边的 *. 移除,贪婪操作符。
man
echo ${url#*.} #移除 *. 所有匹配的最左边的内容。
linuxde.net
echo ${url##*.} #将从左边开始一直匹配到最右边的 *. 移除,贪婪操作符。
net
11.Gerp
选项 -e 制动多个匹配样式:
echo this is a text line | grep -e "is" -e "line" -o
is
line
也可以使用-f选项来匹配多个样式,在样式文件中逐行写出需要匹配的字符。
cat patfile
aaa
bbb
echo aaa bbb ccc ddd eee | grep -f patfile -o
在多级目录中对文本进行递归搜索:
grep "text" . -r -n
.表示当前目录。
#显示匹配某个结果之后的3行,使用 -A 选项:
seq 10 | grep "5" -A 3
#显示匹配某个结果之前的3行,使用 -B 选项:
seq 10 | grep "5" -B 3
#显示匹配某个结果的前三行和后三行,使用 -C 选项:
seq 10 | grep "5" -C 3
#不会输出任何信息,如果命令运行成功返回0,失败则返回非0值
grep -q "test" filename
12.Cut
[root@localhost text]# cut -f2 -d";" test2.txt
Name
tom
jack
//-f2 第二栏
//-d";" 分界符
cut -c1-3 test.txt 一到三之间的
cut -c-5 test.txt 第五个之前的
13.Sed 文本处理流编辑器
可以使用任意的分界符
直接编辑文件选项-i,会匹配file文件中每一行的第一个book替换为books:
sed -i 's/book/books/g' file
-n选项和p命令一起使用表示只打印那些发生替换的行:
sed -n 's/test/TEST/p' file
sed 's/sk/SK/4g' file 全局从匹配到的第四个开始 SK替换sk
sed 's/\/bin/\/usr\/local\/bin/g' /需要转义字符
删除空白行:
sed '/^$/d' file
删除文件的第2行:
sed '2d' file
删除文件的第2行到末尾所有行:
sed '2,$d' file
删除文件最后一行:
sed '$d' file
删除文件中所有开头是test的行:
sed '/^test/'d file
已匹配字符串标记&
正则表达式\w\+匹配每一个单词,使用 [&] 替换它,&对应于之前所匹配到的单词:
echo this is a test line | sed 's/\w\+/[&]/g'
[this] [is] [a] [test] [line]
所有以192.168.0.1开头的行都会被替换成它自已加localhost:
sed 's/^192.168.0.1/&localhost/' file
192.168.0.1localhost
字符串匹配
echo aaa BBB | sed 's/\([a-z]\+\) \([A-Z]\+\)/\2 \1/'
BBB aaa
love被标记为1,所有loveable会被替换成lovers,并打印出来:
sed -n 's/\(love\)able/\1rs/p' file
对于模板test和west之间的行,每行的末尾用字符串aaa bbb替换:
sed '/test/,/west/s/$/aaa bbb/' file
-e选项允许在同一行里执行多条命令:
sed -e '1,5d' -e 's/test/check/' file
14.Tar
压 缩:tar -jcvf filename.tar.bz2 要被压缩的文件或目录路径
查 询:tar -jtvf filename.tar.bz2
解压缩:tar -jxvf filename.tar.bz2 -C 想要解压到的路径