linux shell编程进阶学习(转)
第一节:基础
ls -lh ——可以用户友好的方式看到文件大小
file 文件名 ——查看文件类型
stat 文件名 ——查看文件当前状态
man 命令/函数名 ——查看详细的帮助文档
man中看某一命令选项的定位技巧 —— 输入/ -n -n前面要有一定的空格
#!/bin/bash
echo “Hello World!”
chmod 777 hello.sh或chmod a+x hello.sh等
./hello.sh执行
echo -e选项用来增强,支持转义字符。
var=world
echo “hello $var \n” ——输出hello world \n
echo -e “hello $var \n” ——输出hello world后有换行
echo -e "\033[32;40mHELLO YOU \033[0m"
——输出不同颜色的字体,以\033[开头,
——\033[0m结尾,3x是前景色,4x是背景色
第二节:变量
set/declare ——查看环境变量
env ——查看环境变量
两者是有区别的,set/declare显示所有的本地变量,env是获取环境变量
unset 变量名 ——取消变量
shell中所有变量都是字符串,变量区分大小写,如foo和Foo是不同的变量;
变量必须以字母或下划线开头;
变量名和值之间没有空格:MSG=Hello √ MSG= Hello×
只读变量用readonly: readonly MSG=12 MSG=13×
变量引用:echo $var / echo ${var} 后者更加严格
修改环境变量:PATH=$PATH:/bin/opt
永久修改环境变量:vim ~/.bashrc;export PATH=${PATH}:/bin/opt ;source .bashrc
补充:
/etc/profile:
此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行.
并从/etc/profile.d目录的配置文件中搜集shell的设置.
/etc/bashrc:
为每一个运行bash shell的用户执行此文件.当bash shell被打开时,该文件被读取.
~/.bash_profile:
每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该
文件仅仅执行一次!默认情况下,他设置一些环境变量,执行用户的.bashrc文件.
~/.bashrc:
该文件包含专用于你的bash shell的bash信息,当登录时以及每次打开新的shell时,该
该文件被读取.
~/.bash_logout:
当每次退出系统(退出bash shell)时,执行该文件.
另外,/etc/profile中设定的变量(全局)的可以作用于任何用户,而~/.bashrc等中设定的变量(局部)只能继承/etc/profile中的变量,他们是"父子"关系.
注意他们之间有执行的优先级;
第三节:重定向
输出重定向
ls -l > dat.txt ——重定向到文件,会创建新文件
ls -l >> dat.txt ——追加到文件末尾
ls -l > /dev/null ——空洞文件
ls xxx > txt ——文件不存在,则无法重定位,会输出错误信息
ls xxx > txt 2>&1 ——成功,1代表标准输出,2>&1表示2等同于1
输入重定向
cat >> dat.txt <<R ——表示以R结束!(输入想要的数据后输入R结束)
read var <dat.txt ——将dat.txt中的第一行作为值付给变量var
管道
du -ah | sort -n ——列出一个目录的所有文件,按文件大小排序
ps aux | grep MySQL ——查看服务
rpm -qa | grep vsftpd ——查看软件是否已经安装可以使用这个方法
第四节:数学运算
(expr () let)
expr 1 + 2 ——注意要有空格 expr格式要求较高
var=$(expr 1 \* 8) ——*要用转义
TMP=$((1+2)) ——直接使用() 不用空格
let var=3*8
echo $var
计划任务crontab -e进入编辑
第五节:引用
1.双引号:使用双引号可以输出除$、`、\ 以外的任意字符
echo “$hello world” ——输出 world
2.单引号:使用单引号会忽略任何的引用值
hello=10 echo ‘$hello’——输出$hello
3.反引号:用于将系统命令输出到变量
echo `ls` ——相当于执行ls命令
echo “`ls` Hello world” ——执行ls命令后继续打印hello world
4.反斜线:防止shell误解特殊含义的字符
如& * + | ? $等等
第六节:grep和正则表达式
1.grep常用 grep -n(显示行号) -r(递归) -v(取反) --color --include等选项。
grep -nr “Hello” /home /var --include=*.c
2.正则表达式
元字符:[ ] \ ^ $ . ? | * + ( )
^ ——匹配行首 ls | grep ^[0-9]以0-9开头的; ls |grep ^[^A]以非A开头的
$ ——匹配行尾 ls | grep c$以c结尾的, 还可以使用’ ’ ls |grep ‘^[m]c$’
* ——匹配0次或多次
? ——匹配0次或1次
. ——匹配任意单字符
partten\{n\} ——匹配前面partten出现次数 n为次数
grep --color '^[0-9]\{3\}' txt
partten\{n,\} ——匹配前面partten出现次数 n为至少出现次数
grep --color '^[0-9]\{1,\}' txt
partten\{n,m\} ——匹配前面partten出现次数 出现次数为n-m之间
grep --color '^[0-9]\{1,3\}' txt
3.匹配开头和结尾字符
grep ‘^[hello]’ txt ——以hello开头,或grep ‘^hello’ txt
grep ‘hello$’ txt ——以hello结尾的单词
grep ‘^\bHello\b’ txt ——匹配整个单词Hello
第七节:sed命令
-n -p选项
sed ‘p’ filename ——查看文件内容 p代表print 注意:会显示两行
sed -n ‘p’ filename ——加上-n 表示只输出模式空间的内容
sed -n ‘1 p’ filename ——只打印第一行 2 p打印前两行
sed -n ‘1,3 p’ filename ——打印1-3行
sed -n ‘/main/ p’ file ——打印含有main的行
sed -n ‘/^main/ p’ file ——打印以main开头的行
sed -n ‘/main$/ p’ file ——打印以main结尾的行
sed -n ‘/^[0-9]/\{3\} p’ file——以数字开头 并出现三次
-d选项(delete),与p用法类似:
sed ‘1,3 d’ file ——删除1-3行
-f选项:从文件中读入命令 建立文件cmd.sed 如内容:/main/ p
sed -f cmd.sed filename
-e选项:后面可以接多个命令
sed -n ‘/main/ p’ -e ‘/hello/ p’ filename
-i重要!
-i选项,会直接操作到文件内容
-s替换:
sed ‘1 s/main/hello/’ filename ——把第一行中main换成hello
sed ‘/main/ s/he/llo/’ filename ——把main所在字符串所在中he换成llo
sed ‘2 /main/ s/he/llo/’ filename ——把第二行且含有main的行中he换成llo
如果没有address-range和partten-range,就会操作到所有行,如
sed ‘s/main/hello/’ filename ——把所有行中的main换成hello
substitute-flags:
g(global):全局开关 sed ‘s/main/hello/g’ filename
数字:把每一行第n个符合条件的替换 sed ‘s/main/hello/2’ filename
第二个出现的main
p:打印,不多说
w(write):输出到文件 sed ‘ s/main/hello/w out.txt’ filename
i(ignore):忽略大小写
各种标记可以联合使用:
sed ‘s/main/fuck/gipw 2.txt’ filename
&:
sed ‘s/main/[&]/’ filename 把每一行main换为[main]
实例:ll > txt
txt中内容如下:
总用量 32
drwxrwxr-x. 7 xxx xxx 4096 10月 18 20:19 install
-rw-rw-r--. 1 xxx xxx 0 12月 18 21:12 txt
drwxr-xr-x. 9 xxx xxx 4096 9月 5 17:22 vim
drwxrwxr-x. 9 xxx xxx 4096 12月 15 21:48 work
我只想要得到txt那一行的21:12
怎么做?
答案:
cat txt | grep txt | sed 's/.*..:...*/\1/g'
又如echo "hello my world" | sed 's/.*my.*/[\1]/'这样输出:[my]
第八节.AWK命令
awk命令
比较好的参考资料:
http://www.cnblogs.com/ggjucheng/archive/2013/01/13/2858470.html
格式1:awk -Fs ‘BEGIN{ } / parten/ {action} END{ }’
action中的内容会循环执行 begin与end的内容只会执行一次
awk -F, ‘print $1,$2,$3’ txt ——按逗号分隔成每一个段 打印每一个段
加逗号会输出空格 以方便我们观察
awk -F, ‘print $1 $2 $3’ txt ——这样的会打印出来的没有逗号分隔
也可以不加逗号,加| 、 制表符等等,如下:
awk -F, ‘print $1”|”$2”|”$3’ txt
awk -F, ‘print $1”\t”$2 “\t”$3’ txt
awk -F, ‘/main/ print $1,$2,$3’ txt——匹配含有main的行
awk -F. '/txt/ {print $1 "\t" $2}' txt——以.作为分隔符。。。
内置变量:
FS内置变量 代表分隔符 OFS代表输出分隔符
awk 'BEGIN{FS=","; OFS="\t"; printf("===================\n")} {print $1,$2, $3} END{print("===================")}' txt
可以指定多个分隔符,如 . : %三个
awk 'BEGIN{FS=[.:%]; OFS="\t"; printf("===================\n")} {print $1,$2, $3} END{print("===================")}' txt
指定分隔符并换行RS
文件内容:
101
lvy
BOSS
-
102
XXX
XXX
-
103
QQQ
QQQ
-
要求得到格式如:
lvy:BOSS
XXX:XXX
QQQ:QQQ
答案:
awk 'BEGIN{FS="\n"; OFS=":"; RS="-\n"} {print $2,$3} END{}' txt
输出分隔符ORS
awk 'BEGIN{FS="\n"; OFS=":"; RS="-\n"; ORS="\n----------\n"} {print $2,$3} END{}' txt
用在在每一行执行完毕后输出一些内容。。。
lvy:BOSS
----------
XXX:XXX
----------
QQQ:QQQ
----------
awk中print与printf
print中不需要对变量进行处理,如果是字符串 加双引号
printf与C语言中的用法是一样的。
复习AWK:
awk '{print $0}' txt ——打印txt中所有行
awk 'BEGIN{OFS=":";RS="-\n"} {print $2,$3}' txt
默认的域分隔符是空格 域分隔符使用-F指定
sudo cat /etc/passwd | awk -F: '{print $1}' ——冒号作为域分隔符
对比sudo cat /etc/passwd | awk '{print $1}'看看
统计/etc/passwd:文件名,每行的行号,每行的列数,对应的完整行内容:
awk -F ':' '{print "filename:" FILENAME ",linenumber:" NR ",columns:" NF ",linecontent:"$0}' /etc/passwd
awk 'BEGIN{print("Hello"); FS=".";} {print FILENAME, NR, $2} END{print("World!")}' txt
FILENAME代表文件名;NR代表行号;NF代表列数 $NF可以取最后列
自定义变量:
必须以字符开始,不能使用内置变量,最好放在begin段中
awk -f xxx.awk file —— -f选项指定可以在后面接一个awk脚本。
必须是下面这种形式 BEGIN{要放在一行
BEGIN{
total=0;
}
{
total += 1;
}
END{
print “total is :”, total;
}
一元运算符:+返回数字本身 - 改变数字的符号 ++递增操作
算术运算符:+ - * /
字符串连接:str = str1”__”str2; 可以连接
比较/逻辑运算符:> >= < <= && || 等
正则表达式:~匹配 !~不匹配
实例:统计/etc/passwd下有多少用户使用/bin/bash
cat /etc/passwd | awk -F: 'BEGIN{NUM=0;} /\/bin\/bash/ {print $NF; NUM++;} END{print "The number who use /bin/bash is:", NUM}'
AWK条件与循环:
与c语言一样,awk中也有条件、循环语句
例子:awk -F, ‘{if ($3 == 500) print $1; else print “Not Found!”;}’ /etc/passwd
第九节.shell环境
变量别名:shell中输入alias ll=”ls -l”
如果想退出终端后还有效的话 就写入~/.bashrc
stty -echo ——设置输出不回显 可以再输入密码时,设置。
stty echo ——回显
cal ——查看日历
cal [[day][month]year] [代表是可选的] cal 7 2014表示查看2014年7月份
data ——查看时间
date “+%A” 查看星期几
date "+%Y-%m-%d %H:%M:%S" ——显示2014-12-26 21:06:29
find命令补充:find [option] [-exec | -ok] command {} \;
-exec、-ok选项 -exec是不安全的,-ok是安全的
find /home -name test.txt -exec rm {} \; ——找到后会立刻删除,不会提示
find . -name aaa -ok rm {} \; ——会提示是否删除
find . -name aaa -exec cp {} /home \;
-xargs选项
find . -name aaa | xargs rm
find . -name aaa | xargs -i mv {} /opt
实例:查找当前目录下非.c的文件 并进行删除:
find . -type f ! -name *.c | xargs rm -f ——注意感叹号的位置
第十节.shell脚本编程
shell条件语句:
if list then
do something here
elif list then
do another thing here
else
do something else here
fi
EX1:
#!/bin/sh
SYSTEM=`uname -s` #获取操作系统类型
if [ $SYSTEM = "Linux" ] ; then #如果是linux的话打印linux字符串 注意[]中两边的空格
echo "Linux"
elif [ $SYSTEM = "FreeBSD" ] ; then
echo "FreeBSD"
elif [ $SYSTEM = "Solaris" ] ; then
echo "Solaris"
else
echo "What?"
fi #ifend
基本上和其他脚本语言一样。没有太大区别。不过值得注意的是。[]里面的条件判断。
1 字符串判断
str1 = str2 当两个串有相同内容、长度时为真
str1 != str2 当串str1和str2不等时为真
-n str1 当串的长度大于0时为真(串非空)
-z str1 当串的长度为0时为真(空串)
str1 当串str1为非空时为真
2 数字的判断
int1 -eq int2 两数相等为真
int1 -ne int2 两数不等为真
int1 -gt int2 int1大于int2为真
int1 -ge int2 int1大于等于int2为真
int1 -lt int2 int1小于int2为真
int1 -le int2 int1小于等于int2为真
3 文件的判断
-r file 用户可读为真
-w file 用户可写为真
-x file 用户可执行为真
-f file 文件为正规文件为真
-d file 文件为目录为真
-c file 文件为字符特殊文件为真
-b file 文件为块特殊文件为真
-s file 文件大小非0时为真
-t file 当文件描述符(默认为1)指定的设备为终端时为真
3 复杂逻辑判断
-a 与
-o 或
! 非
一些预定义的变量:
linux中shell变量$#,$@,$0,$1,$2的含义解释:
$$ Shell本身的PID(ProcessID)
$! Shell最后运行的后台Process的PID
$? 最后运行的命令的结束代码(返回值)
$- 使用Set命令设定的Flag一览
$* 所有参数列表。如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。
$@ 所有参数列表。如"$@"用「"」括起来的情况、以"$1" "$2" … "$n" 的形式输出所有参数。
$# 添加到Shell的参数个数
$0 Shell本身的文件名
$1~$n 添加到Shell的各参数值。$1是第1参数、$2是第2参数…。
补充:
filename1 -nt filename2 如果 filename1 比 filename2 新,则为真 [ /tmp/install/etc/services -nt /etc/services ]
filename1 -ot filename2 如果 filename1 比 filename2 旧,则为真 [ /boot/Image -ot arch/i386/boot/bzImage ]
转自:http://blog.csdn.net/scottly1/article/details/42197997
linux shell编程进阶学习(转)的更多相关文章
- 前端学习 linux —— shell 编程
前端学习 linux - shell 编程 shell 原意是"外壳",与 kernel(内核)相对应,比喻内核外的一层,是用户和内核沟通的桥梁.shell 有很多种,国内通常使用 ...
- 详细介绍Linux shell脚本基础学习
Linux shell脚本基础学习这里我们先来第一讲,介绍shell的语法基础,开头.注释.变量和 环境变量,向大家做一个基础的介绍,虽然不涉及具体东西,但是打好基础是以后学习轻松地前提.1. Lin ...
- linux shell编程总结
linux shell编程总结 本周学习了unix/linux shell编程,参考的是<LINUX与UNIX Shell 编程指南>,David Tansley著:徐焱,张春萌等译,由机 ...
- Linux Shell编程与编辑器使用详解
<Linux Shell编程与编辑器使用详解> 基本信息 作者: 刘丽霞 杨宇 出版社:电子工业出版社 ISBN:9787121207174 上架时间:2013-7-22 出版日期:201 ...
- Linux shell脚本基础学习详细介绍(完整版)二
详细介绍Linux shell脚本基础学习(五) Linux shell脚本基础前面我们在介绍Linux shell脚本的控制流程时,还有一部分内容没讲就是有关here document的内容这里继续 ...
- Linux shell脚本基础学习详细介绍(完整版)一
Linux shell脚本基础学习这里我们先来第一讲,介绍shell的语法基础,开头.注释.变量和 环境变量,向大家做一个基础的介绍,虽然不涉及具体东西,但是打好基础是以后学习轻松地前提.1. Lin ...
- [Linux] Linux C编程一站式学习 Part.3
Linux系统编程 文件与I/O C标准I/O库函数与Unbuffered I/O函数 C标准I/O库函数printf().putchar().fputs(),会在用户空间开辟I/O缓冲区 系统函数o ...
- linux —— shell 编程(文本处理)
导读 本文为博文linux —— shell 编程(整体框架与基础笔记)的第4小点的拓展.(本文所有语句的测试均在 Ubuntu 16.04 LTS 上进行) 目录 基本文本处理 流编辑器sed aw ...
- linux —— shell 编程(编程语法)
导读 本文为博文linux —— shell 编程(整体框架与基础笔记)的第4小点的拓展.(本文所有语句的测试均在 Ubuntu 16.04 LTS 上进行) 目录 再识变量 函数 条件语句 循环语句 ...
随机推荐
- SpringMvc @JsonView 使用方式
准确来说,@JsonView注解不是Spring的,它位于jackson-annotation包中: 作用:SpringMvc使用@ResponseBody将结果以json返回客户端, 有些实体类的 ...
- ffplay源码分析1-概述
本文为作者原创,转载请注明出处:https://www.cnblogs.com/leisure_chn/p/10301215.html ffplay是一个很简单的播放器,但是初次接触仍会感到概念和细节 ...
- BFS算法(——模板习题与总结)
首先需要说明的是BFS算法(广度优先算法)本质上也是枚举思想的一种体现,本身效率不是很高,当数据规模很小的时候还是可以一试的.其次很多人可能有这样的疑问,使用搜索算法的时候,到底选用DFS还是BFS, ...
- vue---数据更新,视图不更新问题
写点赞功能时,点赞后已经追加到对象里了,但是视图没有更新. 查找了些资料: 数据已经更新了但是视图不更新的问题,有几个原因: 1.根属性不存在,而想要直接给根属性赋值导致的视图不更新.此时初始化属性的 ...
- 安装svn过程
1.SVN服务器端程序安装 --检测是否安装成功:svn --version2.创建版本库(仓库) 命令格式:svnadmin create 仓库的目录 3.启动服务器 <1>命令行方式 ...
- 【ZeroMQ】1、ZeroMQ(java)入门之Requerst/Response模式
自己最开始是在cloud foundry中接触过消息服务器(nats),或者说是消息中间件,也算是初步知道了一个消息服务器对于分布式的网络系统的重要性,后来自己也曾想过在一些项目中使用它,尤其是在一些 ...
- 撩课-Web大前端每天5道面试题-Day36
1.介绍一下你对浏览器内核的理解? 主要分成两部分:渲染引擎(layout engineer或Rendering Engine)和JS引擎. 渲染引擎:负责取得网页的内容(HTML.XML.图像等等) ...
- python3爬虫(find_all用法等)
#read1.html文件 # <html><head><title>The Dormouse's story</title></head> ...
- CF712E Memory and Casinos
设\(f[i]\)为从\(i\)到\(r+1\)且不走出区间的概率 \(f[i]=p[i]f[i+1]+(1-p[i])f[i-1]\) \(f[i]-f[i-1]=p[i](f[i+1]-f[i-1 ...
- 【代码笔记】iOS-UITableView上的button点击事件
代码. ViewController.h #import <UIKit/UIKit.h> @interface ViewController : UIViewController < ...