Linux 学习笔记 4:Shell 编程
1.简单过滤器
a. pr [OPTION] [FILE]
功能:改变文件打印格式
选项 |
功能 |
-l n |
设定页面长度为n行 |
-w n |
设定页面总宽度为n个字符(不够会被砍掉) |
-h str |
设定页眉为str |
-n |
对行进行编号 |
-k |
分k列输出 |
-t |
不显示页眉、页脚和边距 |
b.head [OPTION] [FILE] 默认10行
选项 |
功能 |
-n k |
显示前k行内容 |
tail [OPTION] [FILE]
选项 |
功能 |
-n k |
显示后k行内容 |
-f |
监控文件内容增长(进程相关) |
c.cut OPTION [FILE]
功能:垂直划分文件
选项 |
功能 |
-cn-m |
剪切n-m列,每列宽度为一个字符 |
-fn-m |
剪切n-m个字段,字段分隔符由-d选项指定 |
-fn,m |
剪切第n和m个字段,字段分隔符由-d选项指定 |
-d |
指定字段分隔符,默认制表符 |
d.paste [OPTION] [FILE]
功能:垂直黏贴文件
选项 |
功能 |
-s |
合并行 |
-d |
指定字段分隔符 |
e.sort [OPTION] [FILE]
功能:对文件内容排序
选项 |
功能 |
-tchar |
用char作为分隔符识别字段 |
-k m,n |
对第m个字段开始到第n个字段进行排序 |
-k m.n |
对第m个字段的第n个字符进行排序 |
-u |
删除重复行 |
-n |
数值排序(不指定则为字典序) |
-r |
逆序 |
-f |
不区分大小写 |
-c |
查看文件是否有序 |
-o file |
将输出存入file,可以和源文件同名(会覆盖) |
f.uniq [OPTION] [INPUT [OUTPUT]]
选项 |
功能 |
-d |
选择并显示输入中的重复行 |
-u |
选择并显示输入中的非重复行 |
-c |
显示每行出现的次数(连续的) |
g.tr [OPTION] SET1 [SET2] 只接受标准输入
功能:将SET1中的字符替换为SET2中的相应字符(位置一一对应)
选项 |
功能 |
-d |
删除字符(无需指定SET2) |
-s |
压缩连续字符 |
h.cmp [OPTION FILE1 FILE2] [OPTION SKIP1 [SKIP2]]
功能:逐字对比两个文件的内容,遇到差异时终止
选项 |
功能 |
-b |
输出第一个差异字节数、行数、字符 |
-l |
输出所有差异字节数 |
-i |
忽略文件1起始SKIP1字节和文件2起始SKIP2字节 |
i.comm [OPTION] FILE1 FILE2
功能:逐行对比两个文件的内容,显示相同行和不同行(需要文件有序)
输出结果共三列:FILE1中独有的行;FILE2中独有的行;共有行
选项 |
功能 |
-n |
隐藏第n列 |
?j.diff [OPTION] FILES
功能:显示两个文件的差别
选项 |
功能 |
-q |
只在文件不同时显示 |
-s |
只在文件相同时显示 |
-c |
显示相同内容 |
-u |
显示不同内容 |
-i |
忽略大小写 |
-b |
忽略重复空白 |
实例a:以从大到小的顺序列出当前目录中的文件
**ls -l的结果中第5列是文件大小,第9列是文件名字 -nr为数值逆序
实例b:统计一个文件中每个单词出现的次数
格式化文件:把空格、制表符、冒号都换成换行符,每行一个单词
对文件进行排序,之后标注每个单词出现的次数
不显示页眉、页脚、边距,一页三列输出
2. 正则表达式 RE 过滤器
模式语句 |
匹配含义 |
基本 BRE |
|
[pqr] |
p, q, r中的单个字符 |
[a-z] |
a到z中的单个字符 |
. |
任意单个字符 |
a* |
0个或任意多个a字符 |
.* |
任意多个任意字符 |
a\{m,n\} |
a字符出现m到n次 |
[^pqr] |
不是p,q,r的单个字符 |
^exp |
exp模式位于行首 |
exp$ |
exp模式位于行尾 |
扩展ERE(-E) |
|
a+ |
1个或任意多个匹配a字符 |
a? |
0个或1个a字符 |
exp1|exp2 |
匹配exp1或exp2 |
(a1|a2)a3 |
匹配a1a3或a2a3 |
a.grep [OPTIONS] PATTERN [FILE…]
功能:在文件中查找指定模式,单/双引号可加可不加
选项 |
功能 |
-G |
匹配基本正则表达式(默认)BRE |
-E |
匹配扩展正则表达式ERE |
-n |
显示匹配行的行号 |
-c |
显示出现次数 |
-e |
匹配以连字符开头的表达式 |
-x |
以整行匹配模式 |
-i |
忽略大小写 |
-v |
列出不匹配的行 |
-l |
只给出匹配模式的文件名 |
练习:
grep –i “^draco” /etc/passwd
在文件/etc/passwd中寻找以draco开头的行,忽略大小写
grep –E “[0-9]+$” files
在文件files中寻找以一个或多个数字结尾的行
grep –l “#include<class1.h>” *.c 在所有以.c结尾的文件中寻找内容包含#include<class1.h>的文件,给出文件名
grep –e “-mtime” files
匹配以-mtime开头的行,若表达式以-开头,需要使用-e选项
grep –v “^draco” files
列出files中不以draco开头的行
find ./ –name “.c” –exec grep –l “#include<class1.h>”
{} \; 精确匹配名字叫.c的文件,并对这些文件执行查找内容#include<class1.h>的操作,输出符合条件的文件名
grep –iE “^(draco|qin).*/bash$” /etc/passwd 忽略大小写,使用扩展正则。查找以draco.或qin.开头,以/bash结尾的行
ps
ind -name “表达式” 没有问题
find -name 表达式 只能匹配出单一结果的情况
我咋知道为什么鸭 - =
b. sed [OPTION] ‘ADDRESS ACTION’ FILES
功能:对数据流进行定位操作;ADDRESS 定位指定行;ACTION 执行指定的编辑操作
选项 |
功能 |
-e |
使用多条指令 |
-f |
从文件中获取指令 |
-n |
只打印模式匹配的行 |
定位方式:
指定行号:k 第k行;m,n 从m到n的连续行
指定模式:/pattern/
模式匹配的行
ACTION |
功能 |
i a c |
插入、追加、修改文本 |
d |
删除行 |
p |
在标准输出上打印结果 |
q |
读取到指定行后退出 |
r fname |
将文件fname的内容放到行后 |
w fname |
将指定行写入文件fname |
= |
打印指定行号 |
s/str1/str2 |
用str2替换指定行中出现的第一个str1 |
s/str1/str2/g |
用str2替换所有的str1 |
示例:
sed ‘5q’
file 读取文件file的前5行
sed
‘/pattern/s/str1/str2/’ file 在文件file中对于满足pattern的行,使用str2替换str1
sed -n
‘/pattern/p’ file 在标准输出打印满足pattern的行
sed -n
‘$=’ file 打印最后一行的行号,即文件行数
sed -n
‘4,$!p’ file 不输出第4行到最后,即输出1-3行
sed -n “$((`sed -n
‘$=’ file`-4)),\$p” file 输出file倒数5行(从总行数-4开始),双引号里的美元符号需要转义
sed -n
‘/<head>/,/<\/head>/w output’ input 将input中从第一个包含<head>的行到第一个包含<Vhead>的行中间的段落输出到output
sed ‘1i\...’
file 在第一行前插入...
sed ‘1a\...’
file 在第一行后插入...
sed ‘1c\...’
file 修改第一行未...
sed ‘/^#/d’ file 删除注释行(以#开头的行)
sed ‘/^[ ]*$/d’
file 删除空白行(从行的开头到结尾,中间包含任意多个空格)
sed
‘s/:/|/g’ file 将文件中所有:替换成|
sed
‘s/pattern//g’ file 将文件中所有符合pattern的片段(注意,不是整行)
标记正则表达式(TRE)
& |
在目标中指代源模式 |
\(pattern\) |
标记源模式中的pattern,在目标中使用\k引用 |
示例:
sed
‘s/Professor/Associate &/g’ file 在替换模式中使用&指代源模式
ls -l |
sed -n ‘/^.\{2,8\}w/p’ 查找具有写权限的文件(w出现在第3位到第9位的任意位置即可)
sed -n
‘/021[0-9]\{8\}/p’ a.bb 查找a.bb中以021开头的11位电话号码(021后有8个数字)
sed
‘s/\([a-zA-Z]*\) *\([a-zA-Z]*\)/\2,\1/’ file
将file中两个全英文字段的顺序颠倒,并用,隔开
c. awk [OPTIONS]
‘SLECTION_CRITERIA {ACTION}’ FILES
SLECTION_CRITERIA:决定程序作用的对象
ACTION:决定了程序操作的行为
功能:
将每一行分成多个字段,默认分隔符为空格和制表符,分隔符可以由-F选项自定义
用$1,$2等来引用每个字段,类似于shell中的命令行位置参数($0表示整行)
可以对各个字段进行正则表达式匹配、比较、条件判断、数值计算等
示例:
awk ‘$4 ~
/.*sbin.*/ {print}’ file 输出第4个字段匹配.*sbin.*的行
awk -F:
‘$3 > 2 {print $2}’ file 用:分隔字段,输出第3个字段>2的行的第2个字段
· 标准输出ACTION
print(默认):未格式化,自动换行 print 参数
printf:格式化,要自己加\n换行符 print“含格式符号的字符串”,参数
print和printf都可以用>和|重定向,目标文件/命令要加引号
格式符号 |
含义 |
% |
格式起始符(必) |
- |
左对齐(默认右对齐) |
0 |
空位补0 |
m.n |
m为输出宽度,n为输出精度(默认为6) |
l |
长整形或双精度数 |
h |
short型 |
类型符号 |
含义 |
d |
十进制 |
o |
八进制 |
x |
十六进制 |
u |
无符号十进制 |
类型符号 |
含义 |
c |
单个字符 |
s |
字符串 |
f |
浮点数 |
e |
指数形式输出实数 |
· 数值操作
数值运算符:+ - * /
% ^
赋值运算:+= -= ++
-- ...
· 变量和表达式
变量:第一次使用时自动声明,默认初始值为0或null;名称区分大小写;根据上下文解释成字符串或数字,并自动转换;直接引用,不需要加$
表达式:由字符串、数字、变量、运算符组合而成;字符串总是加双引号,可以用转义符,八进制加\,十六进制加\x;字符串作为操作数参与数字计算时自动转换成0
比较与逻辑运算符 |
含义 |
~/rexp/ |
匹配正则表达式rexp |
!~/rexp/ |
不匹配正则表达式rexp |
i in array |
数组元素array[i]是否存在 |
示例:
$0 ~
/^john/ 整行以john开头
$3 !~
/^[0-9]+$/ 第3个字段不全是数字(可以是空)
/^$/ 空行
· 写在文件内的awk(-f)
awk -F: -f
awk_scipt file
awk_script写单引号里的内容
BEGIN和END程序段:
BEGIN{
在awk之前执行
}
普通awk语句
END{
在awk之后执行
}
·shell脚本中的awk
位置参数:可以引用shell的命令行参数,需要多套一层单引号
·内置变量
环境数组:用于存储shell环境变量 ENVIRON[“HOME”] ENVIRON[“PATH”]
内置变量:会自动赋值,也可以重新赋值,引用:变量名
变量名 |
功能 |
默认值 |
备注 |
NR |
当前读取行的记录数 |
- |
|
FS |
输入字段分隔符 |
空格 |
FS的赋值放在BEGIN中 |
OFS |
输出字段分隔符 |
空格 |
print语句中参数的分隔符 |
OFMT |
默认浮点数格式 |
%.6f |
|
RS |
记录分隔符 |
换行符 |
可将多行合并成一条记录 |
NF |
当前行的字段数 |
- |
|
FILENAME |
当前输入文件 |
- |
|
ARGC |
命令行中的参数个数 |
- |
|
ARGV |
包含参数列表的数组 |
- |
|
ENVIRON |
包含所有环境变量的数组 |
- |
函数 |
说明 |
int(x) |
返回x的整数值 |
sqrt(x) |
返回x的平方根 |
length() |
返回整个行的长度 |
length(x) |
返回x的长度 |
tolower(s) |
将字符串s变为小写 |
toupper(s) |
将字符串s变为大写 |
substr(str,m) |
从str的第m个位置开始截取剩余子串 |
substr(str,m,n) |
从str的第m个位置开始截取长度为n的子串 |
index(s1,s2) |
返回字符串s2在s1中的位置 |
split(str,arr,ch) |
以ch为分隔符,将str划分到数组arr中,返回字段数 |
system(“cmd”) |
运行命令cmd,并返回其退出状态 eg.date |
· 控制流语句
if(条件){语句}else{语句}
while(条件){语句}
for(i=1;1<=10;i++){语句}
for(x in array){语句}
示例:
为每一行薪资计算税款:
awk –F:
‘{
if ($6 <= 30000) tax=0
else { if ($6 > 30000 && $6 <=50000) tax=($6-30000)*0.15 }
}’ lst
将每一行的字段逆向输出:
awk –F:
‘{ line=$NF
for (i=NF-1;i>0;i--)
line=line”:” $i
print line
}’ lst
输出所有环境变量的值:
awk
‘BEGIN {
for (key in ENVIRON)
print key “=” ENVIRON[key]
}’
根据职位分组,统计每个职位的员工数量($3是职位名):
awk –F:
‘{count[$3]++}
END { for (pos in count)
printf “%10s %4d\n”, pos,
count[pos]
}’ lst
Linux 学习笔记 4:Shell 编程的更多相关文章
- Linux学习笔记(17) Shell编程之基础
1. 正则表达式 (1) 正则表达式用来在文件中匹配符合条件的字符串,正则是包含匹配.grep.awk.sed等命令可以支持正则表达式:通配符用来匹配符合条件的文件名,通配符是完全匹配.ls.find ...
- Linux学习笔记(18) Shell编程之流程控制
1. if语句 (1) 单分支if条件语句 格式为: # 注意条件判断式两端的空格if [ 条件判断式 ];then 程序员 fi 或者 if[ 条件判断式 ] then 程序 fi 例:判断分区使用 ...
- Linux学习笔记:Shell脚本学习
概念 真正能够控制计算机硬件(CPU.内存.显示器等)的只有操作系统内核(Kernel),图形界面和命令行只是架设在用户和内核之间的一座桥梁. 由于安全.复杂.繁琐等原因,用户不能直接接触内核(也没有 ...
- Linux学习笔记 -- 初识 Shell
Shell 是什么 Shell 是一个用C语言编写的程序,它是用户使用Linux的桥梁.Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务.Shell既是 ...
- linux学习(七)Shell编程中的变量
目录 shell编程的建立 shell的hello world! Shell的环境变量 使用和设置环境变量 Shell的系统变量 用户自定义变量 @(Shell编程) shell编程的建立 [root ...
- #Linux学习笔记# 自定义shell终端提示符
我使用的Linux发行版是LinuxMint 17.2 Rafaela,默认情况下Terminal中的shell提示包括了用户名.主机名.当前目录(绝对路径)和提示符.这样会导致当进入一个比较深的目录 ...
- linux学习笔记之shell
本文参考:shell脚本学习指南 本文阅读前提为:知道shell指令,但不知道如何完成一个自动化的shell脚本. 因为编辑本文时,作者也是一个新手.所以,在一些理论上,可能存在错误.如果存在错误,希 ...
- Linux学习笔记<五>——<Shell部分>
管道命令(pipe) 1.把一个命令的输出作为另一个命令的输入 ls -al /etc | less 2.选取命令:cut和grep cut命令可以将一段消息的某段切出来. -d接分隔符,-f是取出第 ...
- Linux学习笔记 -- 为 Shell 传递参数
我们可以在执行 Shell 脚本时,可以向脚本传递参数.脚本内获取参数的格式为:$n.(n 代表一个数字,0为所执行的shell脚本名称,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数,以此类 ...
- Linux学习笔记:shell
目录 通配符 特殊符号 变量 环境变量 默认变量 shell script case if for until while function 本文更新于2019-08-23. 通配符 *:0个至无穷多 ...
随机推荐
- linux ubuntu生成pac文件,实现代理
sudo pip install genpac sudo pip install --upgrade genpac sudo genpac --proxy="SOCKS5 127.0.0.1 ...
- tomcat安装启动之后localhost:8080页面进不去,提示错误500
具体的错误展示页面如下: 首先,需要考虑到是不是安装的tomcat版本和自己安装的jdk的版本一致,如果不一致,建议将tomcat换成和jdk一致或者高于jdk版本的tomcat版本.(比如安装的jd ...
- TreeMap中文排序,TreeMap倒序输出排列
1.TreeMap集合倒序排列 import java.util.Comparator; /** * 比较算法的类,比较器 * @author Administrator * */ public cl ...
- vue2.0插件--loading
loading效果很常见,常见到我们任何一个项目中,都可以见到他的身影.今天就以loading作为切入口,唠叨一下vuejs的插件的写法. 看vuejs官方文档关于插件的说明,关于使用插件和写插件,V ...
- Javascript面向对象编程(一)
什么是面向对象? 它是一种新的编程模式.以往的面向过程是将功能都写在一起,逐行实现.面向对象与其不同,它只关心对象提供的功能,而不在乎细节. 面向对象的特点? 抽象:抓住问题的核心,贯穿始终: 封装: ...
- 前端生成excel
一:安装依赖 1:在package.json 中加入四个依赖包 (1): "json2csv": "^3.11.0", (2):"file-saver ...
- js 字符串操作方法
1.字符串转换 你可以将任何类型的数据都转换为字符串,你可以用下面三种方法的任何一种: 1 2 var num= 19; // 19 var myStr = num.toString(); // &q ...
- Nginx性能调优之buffer参数设置
Nginx 的缓存功能有:proxy_cache / fastcgi_cache proxy_cache的作用是缓存后端服务器的内容,可能是任何内容,包括静态的和动态.fastcgi_cache的作用 ...
- Must practice programming questions in all languages
To master any programming languages, you need to definitely solve/practice the below-listed problems ...
- vue-router传递参数的几种方式
参考资料:vue.js官网 博客 vue-router传递参数分为两大类 编程式的导航 router.push声明式的导航 <router-link>编程式导航传递参数有两种类型:字符串 ...