shell总结

来源:互联网 发布:精算 知乎 编辑:程序博客网 时间:2024/05/19 19:41
是编程语言 特点碎 滚着走
7、8个脚本模板 改成新脚本
程序不是写出来的 一去不复返了
几乎所有脚本都是shell和python必学
先python搞出来 在c改出来
shell是内核表现 还是内核 已经学了1/3内核
linux渐渐向上层开发 30年河东30年河西
没事儿:底层看内核 上层看python
cat /etc/shells 看所支持的shell
echo $SHELL 看默认的
shell-->bash


vim /etc/passwd 其中最后一列显示了用户对应的shell类型


sh解析器不支持补齐 是最古老版本的命令解析器
man 5 passwd
/etc/passwd 把x去掉 省去登录密码 而且都指定了用什么shell
sudo ifconfig eth0 down/up
内建命令 vi .bashrc export PATH= 注意一定得重新起一个终端
. .bashrc 点的意思是生效
内建命令就是亲儿子cd pwd echo 


脚本:可执行命令集合
解释型语言:shell python html 一边解析 一边运行 
编译型语言:c java .net 机器指令 运行  效率高
. source 也都可以执行sh文件
还可以/bin/shell *.sh 运行
最好用 chmod a+x 文件名
(cd ..;ls) 与 cd ..;ls的区别
export VARNAME 声明为全局变量
unset 删除一个变量
通配符:
ls ???.c aaa.c
ls f[a-z].c 


命令代换
VAR=$(date)  echo $VAR 
VAR=`date`  echo $VAR 同上


算数代换
VAR=123
$((VAR+3)) ==$[VAR+3]==$(($VAR+3)) 中括号常用
echo $[2#10+3]  2进制的10


转义字符:./ \ --
touch \$\ \$.txt
touch ./--abc
\续行


引号:
name='xiaom' echo $name
VAR=$(date)
printf "%s\n" $VAR
printf "%s" "$VAR"
双引号能将变量展开 单引号不展开


条件测试:
[ -d DIR ] 如果 DIR 存在并且是一个目录则为真
[ -f FILE ] 如果 FILE 存在且是一个普通文件则为真
[ -z STRING ] 如果 STRING 的长度为零则为真
[ -n STRING ] 如果 STRING 的长度非零则为真
[ STRING1 = STRING2 ] 如果两个字符串相同则为真
[ STRING1 != STRING2 ] 如果字符串不相同则为真
[ ARG1 OP ARG2 ] ARG1 和 ARG2 应该是整数或者取值为整数的变量, OP 是-eq(等于) -ne(不等
于) -lt(小于) -le(小于等于) -gt(大于) -ge(大于等于)之中的一个


echo $?上一个进程返回状态显示出来
test==[ ] 那些eq....只能用于整数
[ $var -eq 11 ]==test $var -eq 11 
[ $var = $var2 ]
[ $var = '123' -a  -f test_test ] 注意短路特性
[ ”$var“ = '123' -a  -f test_test ] 作为好的习惯 当使用变量时,用""括起来  即 "$VAR"
 cd /etc/init.d/里面有很多shell脚本


 [ ARG1 OP ARG2 ] ARG1和ARG2应该是整数或者取值为整数的变量,OP是-eq(等于)
 -ne(不等于)-lt(小于)-le(小于等于)-gt(大于)-ge(大于等于)之中的一个
 
逻辑
read var 
if [ ]; then 
echo "***" 注意缩进 等号两边必须有空格
else/elif [ ]; then 
echo "***"
else
echo "***"
fi


case esac
for/do/done


%70工作都是字符串处理 


egrep ‘正则’ 文件


egrep [0-9a-zA-Z]@[同上] test.regex






位置限定符:那个位置为红色
匹配th开头/结尾的单词 egrep "\<th" test.regex      egrep "th\>" test.regex 
使坏一定用转义字符\:mkdir \*        touch \$\ \$ 
egrep "th\>$" test.regex 行末的th结尾的单词   egrep "^\<th" test.regex   ^$不需要转义
\b不常用 常用:\bthe\b 匹配单词the  是上面的简化版本而且还有匹配单个字符的作用
\bthe\b 匹配一个单词 而 ‘the'匹配所有有the的项
\Bthe\B 匹配单词中间有the的单词


匹配出ip:
[]匹配括号中任意一个字符 
{n}它前面的单元匹配n次;{m,n}它前面的单元至少匹配n次 最多匹配m次


egrep 'lookupdev' . -r   终于可以递归查找了


egrep "^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$" test.regex  注意别忘了.得转义  
可以用()再次精简 egrep "^([0-9]{1,3}\.){3}[0-9]{1,3}$" test.regex 注意别写成egrep "(^[0-9]{1,3}\.){3}[0-9]{1,3}$" test.regex
grep支持的是基础正则 所有的都得加转义字符 或加 -E


匹配出邮箱:@不用转义
+它前面的单元匹配1次或多次
*它前面的单元匹配零次或多次
egrep '[0-9a-zA-Z]+@[0-9a-zA-Z]+\.[0-9a-zA-Z]' file
--------------------find 针对目录或文件-----------------------------------
shell配合find非常常用 针对目录 与上面的正则不适用
find找文件 grep找内容 两者结合非常吊 可以看OS所有内容
find ./lsystem -name day01
find ~ -size +100k -size -100M  大于100k小于100M的所有 若没有单位指的是512B(扇区大小)
find /usr -type f -name gcc
find ./ -maxdepth 1 -type d 深度为1 即查找当前的目录
find ./ -type f -exec ls -l {} \;看文件的详细信息(记住就可以了)  -exec可以换成-ok(更安全会有提示) 注意顺序
find ./ -maxdepth 1 -type d | xargs ls -ld  即每个文件都列出来 与上面一样是分片式显示 防止阻塞
只不过有个小bug 不能显示这样中间有空格的文件:test testfile
用以下解决:
find ./ -maxdepth 1 -type f -print0 | xargs -0 ls -ld 


在/logs目录中查找更改时间在5日以前的文件并删除它们:find logs -type f -mtime +5 -exec rm {} \;
-atime(access) ctime(内容change) mtime(modify 属性修改)以天为单位: 
find ./ -name "syslog*" -mtime +5 -exec ls -ld {} \;即5天前的所有日志 具体内容显示出来


杂例:
find ./ -name "*.sh" 注意顺序
-----------------------sed针对行---------------------------------
适用grep正则
有关打印的最好加上 后面最好加上-n
若反应到文件中 加上 -i


sed awk配合正则表达式是shell的两个大模块 很重要
sed与vim是一个祖先 sed是末行模式下 针对行
格式1 sed 参数(-i) 脚本语句(/pattern正则表达式/action编辑操作) 目标文件
格式2 sed 参数 -f 脚本文件 目标文件


sed程序一行一行读出待处理文件,如果某一行与pattern匹配,则执行相应的action,
如果一条命令没有pattern而只有action,这个action将作用于待处理文件的每一行。


sed "2a xxxxxxx" test.txt 即第三行变成了xxxxxxx 只是加到缓冲区 加上 -i 能反应到文件里
i                        二
sed 默认是basic 所以加上-r 碰到括号就不用转义了
:s/old/new/ /加不加都可以
:s/old/new/g 更换当前行
:%s/old/new/g 更换当前文件 
:27,30s/old/new/g 27-30行变
sed '2,5d' file 删除2-5行 只是加到缓冲区
sed '/echo/s/echo/printf/g' file 等价于 sed 's/echo/printf/g' file 
sed 's/echo/-&-/' file 等价于 sed 's/echo/-echo-/' file


sed '/abc/p' file 匹配上的打印2遍(p是打印的意思) 加上-n才能打印一遍 -n放后面 


sed 's/([a-z])([a-z])/-\1-~\2~/' file  
sed -r '/([0-9])([0-9])/p' file -n
sed 's/yes/no/g;s/no/yes/g' file


去掉所有的html标签<>
.是匹配任意一个字符 
[^ ] 匹配除[]中字符外的所有字符


sed 's/<[^>]*>//g' file 与 sed 's/<.*>//g' file贪心算法


1) 列出上海大盘2014-05-29日的数据
egrep "\<2014-05-29" stock_data.txt
2) 列出上海大盘2014-05月份的数据 grep
grep -E "\<2014-05" stock_data.txt 
3) 列出上海大盘2014-06月所有上涨的数据
sed '/+/p' stock_data.txt –n|grep '\<2014-06'
4) 统计上海大盘2014-06月所有上涨的数据的个数
sed '/+/p' stock_data.txt -n|grep '\<2014-06'|wc -l
5) 显示上海大盘2014-07月份所有上涨数据的时间和上涨的幅度(%)
sed '/+/p' stock_data.txt -n|grep '\<2014-07'|awk '{print $1 $6}'
6) 显示上海大盘2014-06月份所有上涨数据的时间和上涨的幅度(%),第5条-第10条之间的数据
sed '/+/p' stock_data.txt -n|grep '\<2014-06'|awk '{print $1 $6}'|sed '5,10p' -n
7) 列出上海大盘2014-06月份涨跌在1个点和2个点之间的数据
grep '\<2014-06' stock_data.txt |awk  '$6>1 && $6<2 {print $6}'
--------------------awk以列为处理单位-------------------------------
显示所有pid: ps aux | awk '{print $2}'  '脚本'里没有正则只有action
ps aux | awk '$2<=2000 && $2>800 {print $2}' 


以:为分割的 从1数到第七个 打印出第七列 而不是从0开始数
awk -F: '{print $7}' /etc/passwd 等价于 awk 'BEGIN {FS=":"} {print $7}' /etc/passwd
注意“” ''!!!!!!!!!!!!!!!!不要混淆


自动变量$1、$2分别表示第一列、第二列等,类似于Shell脚本的位置参数,而$0表示整个当前行。
如果某种产品的库存量低于75则在行末标注需要订货:
awk '$2<75 {printf "%s %s\n" $0,"reorder"} $2>75 {print $0}' file


awk '/^ *$/ {var=var+1} END {print var}' file 看有多少空行数
看pid在800-2000之间的个数有多少
ps aux | awk '$2<=2000 && $2>800 {var=var+1} END {print var}' 


看书 pdf awk sed 


egrep "^([0-9]{1,3}\.){3}[0-9]{1,3}$" test.regex
regcomp():编译正则表达式 ----结构体--->描述 "^([0-9]{1,3}\.){3}[0-9]{1,3}$" test.regex
regexec():执行正则表达式 用结构体样式的正则,匹配字符串
refree():释放正则表达式结构体 regerror():正则处理函数


手头有资料 查
先脸熟 有印象 基类一些脚本:  
安装vim软件的命令写成一个脚本
vim编辑器的配置 
没有必要背 只做练习即可
开源库 和 小项目1,2个


print{NR} //打印出所有行
tail -nx file 即显示file文件的最后x行
grep -n   -n是显示行号的意思
sed -n '$=' file 具体点就是-n抑制输出, $到最后一行,=打印行号。
mkdir -p  可以递归创目录


*********************************
ls -l 显示的是byte字节 ls -lh比较人性化 文件夹是4K


-------------------------------------------------------------------------
学正则表达式
wildcard 通配符


cut :
-b :以字节为单位进行分割。这些字节位置将忽略多字节字符边界,除非也指定了 -n 标志。
-c :以字符为单位进行分割。
-d :自定义分隔符,默认为制表符。
-f :与-d一起使用,指定显示哪个区域。
-n :取消分割多字节字符。仅和 -b 标志一起使用。如果字符的最后一个字节落在由 -b 标志的 List 参数指











0 0
原创粉丝点击