目录结构
1、 文件操作篇
2、 文件编辑篇
3、 管道操作篇
4、 字符串处理篇
5、 综合校验篇
1、文件操作篇
序号
|
作用描述
|
相应命令
|
1
|
改变目录
|
命令为:cd(change directory),
回到家目录:cd ~,进入/usr/bin的命令为cd /usr/bin
|
2
|
查看当前目录
|
命令为:pwd
返回当前所在的绝对目录
|
3
|
查看目录下的文件的详细信息
|
命令:ls -l
显示根目录文件详情:ls -l /
|
4
|
创建目录
|
命令:mkdir
在家目录中创建test文件夹:mkdir ~/test
|
5
|
创建文件
|
命令:touch
在家目录中创建input.txt文件:touch ~/input.txt
|
6
|
删除文件
|
命令:rm
在家目录中删除input.txt文件:rm ~/input.txt
|
7
|
删除文件夹
|
命令:rm -r
删除家目录的test文件夹:rm -r ~/test
其中"-r"为recursive,递归删除文件夹下所有数据的意思
加"-f"参数则无提示,直接删除掉
|
8
|
复制文件
|
命令:cp
复制家目录下的input.txt到家目录上的test目录中:cp ~/input.txt ~/test/
或者复制后重命名:cp ~/input.txt ~/test/input.txt.bak
|
9
|
复制文件夹和文件夹中的内容
|
命令:cp
复制家目录下的test文件夹到/tmp目录中:cp -r ~/test /tmp
|
10
|
移动文件
|
命令:mv
移动/tmp/test目录到家目录中: mv /tmp/test ~/
|
11
|
查找
|
命令:
find [路径] [参数]
查找当前路径下名为"input.txt"的文件:find . -name input.txt
查找当前路径下名为"input.*"的文件:find . -name "input.*"
查找当前路径下文件拥有者为tianliang的文件:find . -user tianliang
|
12
|
查看文件内容
|
命令: cat 文件路径
查看input.txt文件中的内容 cat input.txt
输出input.txt文件中的内容,并添加行号:cat -n input.txt
命令:tail
从尾部往前看 tail -30 input.txt,即为查看input.txt的倒数30行
命令: head
从头部往后看:head -30 input.txt,即为查看input.txt的前30行
命令:more
从前往后一屏一屏的看文件内容:more input.txt,输入空格为向后翻屏,适用于文本内容一屏显示不小,但又全部要看一下的情况
|
13
|
管道
|
命令:”|“
即:就是把前一个命令的结果当成后一个命令的输入
查看input.txt后查看是否包含某个字符串:cat input.txt |grep 123
|
14
|
重定向
|
命令:
> 输出重定向到一个文件或设备 覆盖原来的文件
如:将文件目录列表输出到文件filelist.txt中:
ls -l > filelist.txt
>! 输出重定向到一个文件或设备 强制覆盖原来的文件
>> 输出重定向到一个文件或设备 追加原来的文件
< 输入重定向到一个程序
标准格式:command-line [n] < file或文件描述符&设备
如: cat < filelist.txt
cat > 1.txt < filelist.txt
|
2、 文件编辑篇
2.1 文件编辑器选择
linux文件编辑器,主要是vi和vim,其中vim是vi的升级版,升级点如下:
1、多级撤消
我们知道在vi里,按u只能撤消上次命令,而在vim里可以无限制的撤消。
2、易用性
vi只能运行于unix类中,而vim不仅可以运行于unix,windows ,mac等多操作平台。
3、语法加亮
vim可以用不同的颜色来加亮你的代码。
4、可视化操作
就是说vim不仅可以在终端运行,也可以运行于x window、 mac os、 windows。
5、对vi的完全兼容
因此建议使用vim,如果没有以上特殊要求,直接使用vi亦可。以个人习惯为主
2.2 vim/vi的三种模式
1、命令行模式 (command mode/一般模式)
任何时候,不管用户处于何种模式,只要按一下ESC键,即可使Vi进入命令行模式;我们在shell环境(提示符为$)下输入启动Vi命令,进入编辑器时,也是处于该模式下。
在该模式下,用户可以输入各种合法的Vi命令,用于管理自己的文档。此时从键盘上输入的任何字符都被当做编辑命令来解释,若输入的字符是合法的Vi命令,则Vi在接受用户命令之后完成相应的动作。但需注意的是,所输入的命令并不在屏幕上显示出来。若输入的字符不是Vi的合法命令,Vi会响铃报警。
测试一下:vi input.txt,移动光标,双击dd删除一行
2、文本输入模式 (input mode/编辑模式)
在命令模式下输入插入命令i、附加命令a 、打开命令o、修改命令c、取代命令r或替换命令s都可以进入文本输入模式。在该模式下,用户输入的任何字符都被Vi当做文件内容保存起来,并将其显示在屏幕上。在文本输入过程中,若想回到命令模式下,按键即可。
测试一下:vi input.txt后,单击键盘中的a键,进入文本输入模式,此时随意输入均为文件正文
3、末行模式 (last line mode/指令列命令模式)
末行模式也称ex转义模式。
Vi和Ex编辑器的功能是相同的,二者主要区别是用户界面。在Vi中,命令通常是单个键,例如i、a、o等;而在Ex中,命令是以按回车键结束的正文行。Vi有一个专门的“转义”命令,可访问很多面向行的Ex命令。在命令模式下,用户按“:”键即可进入末行模式下,此时Vi会在显示窗口的最后一行(通常也是屏幕的最后一行)显示一个“:”作为末行模式的提示符,等待用户输入命令。多数文件管理命令都是在此模式下执行的(如把编辑缓冲区的内容写到文件中等)。末行命令执行完后,Vi自动回到命令模式。
测试一下:vi input.txt后,按shift+":"键,则进入末行模式。输入wq,则为保存修改后退出vi命令。
2.3 vim/vi常用命令
1〉光标移动命令
0 移动到光标所在列的最前面[Home]
$ 移动到光标所在列的最后面[End]
[CTRL][d] 向下半页
[CTRL][f] 向下一页[PageDown]
[CTRL][u] 向上半页
[CTRL][b] 向上一页[PageUp]
H移动到视窗的第一列
M移动到视窗的中间列
L移动到视窗的最后列
G移动到文件最后列
nG直接用数字 n 加上大写 G 移动到第 n 行 (等同于命令“:n”)
fx往右移动到 x 字符上
tx往右移动到 x 字符前
shift +g 跳到文件尾 (等同于G)
gg 跳到文件头
2〉删除操作命令
x 删除光标所在的字符【delete】
dw 删除光标所在的单词
d $ 删除光标至行尾的所有字符
/d d 同/d d $
dd 删除当前行
dnd 删除当前n行
dG 删除当前行到最后一行
可在删除命令前加上数字,如<5x表示删除5行
3〉改变与替换操作命令
r 替换光标所在的字符
/rr 替换字符序列
c $ 替换自光标位置至行尾的所有字符
cl 修改当前字符
cc 修改当前行
c$ 修改到行尾的内容
:%s#abc#123#g 将文中的所有abc都替换为123
ddp 上下两行交换(其实是先dd,然后执行p)
4〉查询命令
/string 往前搜索string【支持正则】
n 查找下一个
?string 往后搜索string
/+上下箭头 搜索历史
:+上下箭头 :命令的历史
* 往前查找当前word,前提是光标移动到要查找的word
# 往后查找当前word,前提是光标移动到要查找的word
/\<word\> 只匹配word,不匹配wordstr等等
% 查找匹配的括号,前提是光标要在一边的括号上
fx 在当前行移动到下一个字符x
5〉拷贝与粘贴命令
yw 将光标所在单词拷入剪贴板
y$ 将光标至行尾的字符拷入剪贴板
yy 将当前行拷入剪贴板
yny 将当前n行拷入剪贴板
p 将剪贴板中的内容粘贴在光标后
P 将剪贴板中的内容粘贴在光标前
6〉文件编辑、保存及退出vi命令
:q 不保存退出
:q! 不保存强制性退出
:w 保存编辑
:w filename 存入文件filename中
:w! filename 强制性存入文件filename中
:wq / :x / ZZ 保存退出
:wq! 强制保存然后退出
3、 管道操作篇
3.1 定义与形式化
在Linux中进行稍复杂的操作,通常需要借助管道命令"|"多个命令的组合,形式如下:
command 1 | command 2 | command 3 ……
管道命令必须,能够接受来自前一个命令的standard output作为该命令的standard input来处理
3.2 管道操作示例与常用问题
1、cat input.txt | grep “tianliang”
在文本input.txt中查找tianliang存在的行,并输出出来
2、cat notExist.txt input.txt | grep "tianliang"
notExist.txt不存在,则此执行失败命令的标准错误不会通过管道传递。
管道只能处理标准输出,除此之外均不会处理,但不会因为错误的产生而影响真实标准输出的执行
3、cat input.txt | grep "ad" | head -1
管道可以连环使用,但要求管道的右边必须能接受标准输出
但:cat input.txt | grep "ad" | head -1 | ls -l
由于管道的最右侧的"ls -l"命令不能接受标准输入,所以管道前边的标准输出是无效的,即管道输出失败。但命令是可以正常执行,只是预想的管道输出没有任何作用。
4、find -name "input*txt" | xargs cat 或者 find -name "input*txt" | xargs rm -rf
如上即为解决第3问题中某些命令无法管道传递的问题
xargs从标准输入(stdin)中读取数据进行处理
- 数据以空格进行分隔
- 可以根据参数进行一次或多次处理,默认的处理命令是/bin/echo
- 空行不进行处理,会被忽略
- 遇到命令状态为255时,xargs会立刻停止,譬如发生错误时.
通过xargs将不可接受管理输出的命令通过间接变换,转换成可以接受的执行。
即将之前的标准输入通过空格分格转化成一个一个的argument参数,传递给后边的命令接授执行
4、 字符串处理篇
4.1 awk命令
awk是行处理器: 相比较屏幕处理的优点,在处理庞大文件时不会出现内存溢出或是处理缓慢的问题,通常用来格式化文本信息
awk处理过程: 依次对每一行进行处理,然后输出
awk命令形式:
awk [-F|-f|-v] ‘BEGIN{} //{command1; command2} END{}’ file
[-F|-f|-v] 大参数,-F指定分隔符,-f调用脚本,-v定义变量 var=value
' ' 引用代码块
BEGIN 初始化代码块,在对每一行进行处理之前,初始化代码,主要是引用全局变量,设置FS分隔符
// 匹配代码块,可以是字符串或正则表达式
{} 命令代码块,包含一条或多条命令
; 多条命令使用分号分隔
END 结尾代码块,在对每一行进行处理之后再执行的代码块,主要是进行最终计算或输出结尾摘要信息
特殊要点:
$0 表示整个当前行
$1 每行第一个字段
NF 字段数量变量
NR 每行的记录号,多文件记录递增
FNR 与NR类似,不过多文件记录不递增,每个文件都从1开始
\t 制表符
\n 换行符
FS BEGIN时定义分隔符
RS 输入的记录分隔符, 默认为换行符(即文本是按一行一行输入)
~ 匹配,与==相比不是精确比较
!~ 不匹配,不精确比较
== 等于,必须全部相等,精确比较
!= 不等于,精确比较
&& 逻辑与
|| 逻辑或
+ 匹配时表示1个或1个以上
/[0-9][0-9]+/ 两个或两个以上数字
/[0-9][0-9]*/ 一个或一个以上数字
FILENAME 文件名
OFS 输出字段分隔符, 默认也是空格,可以改为制表符等
ORS 输出的记录分隔符,默认为换行符,即处理结果也是一行一行输出到屏幕
-F'[:#/]' 定义三个分隔符
awk '{print "a"}' /etc/passwd //输出相同个数的a行,一行只有一个a字母
awk -F":" '{print $1}' /etc/passwd
awk -F: '{print $1; print $2}' /etc/passwd //将每一行的前二个字段,分行输出
awk -F: '{print $1,$3,$6}' OFS="\t" /etc/passwd //输出字段1,3,6,以制表符作为分隔符
-F指定分隔符
awk -F":" '{print $1}' /etc/passwd
awk -F":" '{print $1 $3}' /etc/passwd //$1与$3相连输出,不分隔
awk -F":" '{print $1,$3}' /etc/passwd //多了一个逗号,$1与$3使用空格分隔
awk -F: '{print NF}' /etc/passwd //显示每行有多少字段
awk -F: '{print $NF}' /etc/passwd //将每行第NF个字段的值打印出来
awk -F: 'NF==4 {print }' /etc/passwd //显示只有4个字段的行
awk -F: 'NF>2{print $0}' /etc/passwd //显示每行字段数量大于2的行
awk '{print NR,$0}' /etc/passwd //输出每行的行号
awk -F: '{print NR,NF,$NF,"\t",$0}' /etc/passwd //依次打印行号,字段数,最后字段值,制表符,每行内容
awk -F: 'NR==5{print}' /etc/passwd //显示第5行
awk -F: 'NR==5 || NR==6{print}' /etc/passwd //显示第5行和第6行
route -n|awk 'NR!=1{print}' //不显示第一行
//匹配代码块
//纯字符匹配 !//纯字符不匹配 ~//字段值匹配 !~//字段值不匹配 ~/a1|a2/字段值匹配a1或a2
awk '/mysql/' /etc/passwd
awk '/mysql/{print }' /etc/passwd
awk '/mysql/{print $0}' /etc/passwd //三条指令结果一样
awk '!/mysql/{print $0}' /etc/passwd //输出不匹配mysql的行
awk '/mysql|mail/{print}' /etc/passwd
awk '!/mysql|mail/{print}' /etc/passwd
awk -F: '/mail/,/mysql/{print}' /etc/passwd //区间匹配---典型讲解
awk '/[2][7][7]*/{print $0}' /etc/passwd //匹配包含27为数字开头的行,如27,277,2777...
awk -F: '$1~/mail/{print $1}' /etc/passwd //$1匹配指定内容才显示
awk -F: '{if($1~/mail/) print $1}' /etc/passwd //与上面相同
awk -F: '$1!~/mail/{print $1}' /etc/passwd //不匹配
awk -F: '$1!~/mail|mysql/{print $1}' /etc/passwd
IF语句
必须用在{}中,且比较内容用()扩起来
awk -F: '{if($1~/mail/) print $1}' /etc/passwd //简写
awk -F: '{if($1~/mail/) {print $1}}' /etc/passwd //全写
awk -F: '{if($1~/mail/) {print $1} else {print $2}}' /etc/passwd //if...else...
输出分隔符OFS
awk '$6 ~ /FIN/ || NR==1 {print NR,$4,$5,$6}' OFS="\t" netstat.txt
awk '$6 ~ /WAIT/ || NR==1 {print NR,$4,$5,$6}' OFS="\t" netstat.txt
//输出字段6匹配WAIT的行,其中输出每行行号,字段4,5,6,并使用制表符分割字段
while语句
awk -F: 'BEGIN{i=1} {while(i<NF) print NF,$i,i++}' /etc/passwd
4.2 sed命令
管道命令,主要是以行为单位进行处理,可以将数据行进行替换、删除、新增、选取等特定工作
命令行格式为:
sed [-nefri] ‘command’ 输入文本
常用选项:
-n∶使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN的资料一般都会被列出到屏幕 上。但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来。
-e∶直接在指令列模式上进行 sed 的动作编辑;
-f∶直接将 sed 的动作写在一个档案内, -f filename 则可以执行 filename 内的sed 动作;
-r∶sed 的动作支援的是延伸型正规表示法的语法。(预设是基础正规表示法语法)
-i∶直接修改读取的档案内容,而不是由萤幕输出。
常用命令:
a ∶新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
c ∶取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
d ∶删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
i ∶插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
p ∶列印,亦即将某个选择的资料印出。通常 p 会与参数 sed -n 一起运作~
s ∶取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g 就是啦!
示例:
//以行为单位删除
删除指定行:cat -n input.txt | sed '1d'
删除指定行区间的数据 cat -n input.txt |sed '1,4d'
删除第m到最后行的数据:cat -n input.txt |sed '1,$d'
//以行为单位添加
在第2行后插入指定字符串:cat -n input.txt | sed '1a 第2行后插入数据'
在第2行前插入指定字符串:cat -n input.txt | sed '1i 第2行后插入数据'
在第2行后插入两行或多行字符串:cat -n index.html |sed '2a dkkkkk \
> sdaklaf'
//以行为单位替换与显示
将第1,2行的内容替换成为'新内容’:cat -n input.txt | sed '1,2c 新内容'
只显示文档的第3到第5行: cat -n input.txt | sed -n '3,5p'
//数据的搜寻并显示、删除、替换
搜索正则表达式,只输出命中正则表达式的行:cat -n input.txt | sed -n '/html/p'
如果不-n,则会原样输出和命中行输行,会造成命中行的重要
搜索正则表达式,删除掉命中的行:cat -n input.txt | sed '/html/d' > newOutput.txt
替换表达式: sed 's/要被取代的字串/新的字串/g'
如将字符串html替换成jsp, cat -n input.txt | sed 's/html/jsp/g'
4.3 sort命令
sort命令,它将文件进行排序,并将排序结果标准输出。sort命令既可以从特定的文件,也可以从stdin中获取输入。
语法: sort(选项)(参数)
选项:
-b:忽略每行前面开始出的空格字符;
-c:检查文件是否已经按照顺序排序;
-d:排序时,处理英文字母、数字及空格字符外,忽略其他的字符;
-f:排序时,将小写字母视为大写字母;
-i:排序时,除了040至176之间的ASCII字符外,忽略其他的字符;
-m:将几个排序号的文件进行合并;
-M:将前面3个字母依照月份的缩写进行排序;
-n:依照数值的大小排序;
-o<输出文件>:将排序后的结果存入制定的文件;
-r:以相反的顺序来排序;
-t<分隔字符>:指定排序时所用的栏位分隔字符;
+<起始栏位>-<结束栏位>:以指定的栏位来排序,范围由起始栏位到结束栏位的前一栏位。
参数:
文件:指定待排序的文件列表。
示例:
1、sort将文件/文本的每一行作为一个单位,相互比较,比较原则是从首字符向后,依次按ASCII码值进行比较,最后将他们按升序输出。
sort input.txt
2、忽略相同行使用-u选项,等同于管道符+uniq命令:
sort -u input.txt 等同于 sort input.txt | uniq
3、按指定分隔符切分行、指定列、指定列类型、指定排序升降
需要:-n、-r、-k、-t选项的配合使用:
-n指待按数字类型, -r逆序,-k为分隔字段,后跟数字代表取第几个字段
sort -t: -nrk2 input.txt
意为对input.txt按":"分隔每一行,对第2个字段按数值排序、降序
4、多字段联合排序
- 数据样本
姓名 数学成绩 英语成绩
张三 90 80
张四 100 90
张五 80 70
张六 60 90
张七 80 60
张八 80 65
张九 90 98
- 先按数学成绩排序,相同成绩的情况按英语成绩排序
cat input.txt | tail -n +2 | sort -k2nr -k3nr
- 联合排序结果
4.4 其它常用小命令
cut: 按行处理,按分隔符将行切割成若干字段
cat input.txt | cut -d ':' -f 1,3
将文本input.txt按":"分隔后, 取出第1和第3个字段
uniq:如果排序完成了,将重复的行仅显示一次。注意,若文件未排序,该命令失效。
格式:uniq [-ic] file_path
参数说明:
-i:忽略大小写;
-c:统计每行重复的次数;
sort input.txt | uniq -ic
将input.txt升序排列后,忽略大小写去重,并输出重复的行数
wc: 统计文本文件中有多少字,多少行,多少字符。
格式:wc [-lwm] file_path
参数说明:
-l:仅显示行数;
-w:仅显示字数(英文单词个数);
-m:字符数;
查看一个文件中有多少行:wc -l input.txt