0x01. Linux基础命令
-
+
find
+
功能: 查找文件并执行指定操作
常用参数:
-name 指定文件名
-gid,uid, group, user
-path 指定查找路径
-type 指定文件类型(b块设备、c字符设备、d目录、f普通文件、l符号链接文件)
-exec
+locate/mlocate/updatedb
+
功能: locate利用事先建立的系统中所有文件名称及路径的locate数据库,实现快速定位给定的文件。 mlocate是locate命令的安全增强版,4locate命令实际是mlocate命令的符号连接。
经验: 由于locate指令基于数据库进行查询,第一次允许前,必须使用updatedb执行创建locate数据库,并定时更新locate数据库。
+dd
+
功能: 用于复制文件并对原文件的内容进行转换和格式化处理。
参数: conv=<关键字,关键字,..> 将文件按指定关键字的方式转换(在,前后无空格)
+
| conv参数 | +说明 | +
|---|---|
| ascii | +将ebcdic码转换成ascii码 | +
| block | +输出cbs指定的字节数 | +
| lcase | +将大写字母转换成小写字母 | +
| ucase | +将小写字母转换成大写字母 | +
| swab | +交换每对输入字节,读入的字节是奇数,最后字节简单的复制到输出 | +
| sync | +用0填充每个输入块的末尾,使其大小为选项ibs的值 | +
1 | 复制文件并将文件中的小写字母全部转换成大写字 |
-
+
ln
+
功能: ln 命令用来为文件创建连接,连接类型分为硬连接(hard link)和符号连接(symbolic link)两种。默认的连接类型是硬连接,使用“-s”选项创建符号连接。
语法:ln sourcefile targetfile
硬连接和符号连接区别:
(1)硬连接要创建一个具有相同索引节点的连接文件;符号连接文件中保存的是源文件存放的路径。因此删除源文件后,硬连接没影响,符号连接失效。
(2)创建硬连接时,源文件和目标文件必须在同一个硬盘分区下,不能跨分区。符号连接可以跨分区。因为索引节点在不同的分区中自成体系。
(3)互为硬连接的两个文件等同于一个文件,删除两者任何一个,不影响另外一个文件。修改两者任何一个,另外一个文件内容发生同样变化。
(4)ln命令默认创建连接为硬连接,不能为目录创建硬连接。为目录建立连接,必须使用符号连接。
+unlink
+
功能: 使用系统调用函数unlink删除指定文件。只能删除普通文件,不能删除目录。
+rename
+
功能: rename用字符串替换的方式批量改变文件名。本质是采用替换的方式将文件名中的指定字符串替换为目标字符串,使用shell通配符。
+
0x02. Linux 文本处理
1. sed(文本转换和过滤)
功能: sed是一个单行流式文本编辑器,被用来在输入流(文本输入或命令管道)上处理基本的文本转换。还具有强大的文本过滤功能。
原理: sed在工作时,首先将文本文件的一行内容读取到临时缓冲区(模式空间),然后对文本进行处理,处理完成后将缓冲区中的文本显示到标准输出设备;然后继续处理下一行文本,重复此过程,直到文件结束。sed还有内部命令,常用的有d删除指定的行,s替换指定的文本,i插入文本。
参数:
| 参数 | +功能 | +
|---|---|
| -e <脚本> | +添加脚本到命令中去执行 | +
| -f <脚本文件> | +添加脚本文件到命令中去执行 | +
| -i <后缀> | +直接在文件中进行替换 | +
| -l <数字> | +指定行的最大字符长度 | +
| -r | +在脚本中使用扩展的规则表达式 | +
| -s 或 -separate | +每个文件看做单独的,而不是将所有文件看做一个长的文本流 | +
| -u 或 -unbuffered | +从文件中加载最少的数据量,增加清空输出缓冲区的频率 | +
注意:
(1)使用sed处理文本文件时,原文本内容不发生改变。
(2)sed命令通常被用来自动编辑或处理一个或多个文本文件,可以极大的简化对文本文件的反复操作和。
(3)sed的内部命令最好使用单引号括起来。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 删除文件的第一行
] sed -e '1d' /etc/fstab
删除多行内容
] sed -e '1,3d' /etc/fstab
删除文件中以'#'开头的行,sed命令中'/'之间为正则表达式
] sed -e '/^#/d' /etc/xinetd.conf
将一行中第一处符合模式的内容替换掉,如果要替换所有内容,则命令尾部加上参数g
] sed -e 's/defaults/hello/' //etc/fstab
替换所有指定内容
] sed -e 's/defaults/hello/g' /etc/fstab
已匹配字符串标记 &
] echo this is an example | sed 's/\w\+/[&]/g'
[this] [is] [an] [example]
子串匹配标记(\1),匹配给定样式的其中一部分
\(pattern\)用于匹配子串,第一个子串,\1;第二个子串,\2。
] echo this is digit 7 in a number | sed 's/digit \([0-9]\)/\1/'
this is 7 in a number
sed表达式通常用单引号来引用,不过也可以使用双引号。双引号会通过对表达式求值进行扩展
] text=hello
] echo hello world | sed "s/$text/HELLO/"
HElLO world
sed正则表达式
命令p用于显示模式空间的内容。默认情况下,sed把输入行打印在屏幕上,选项-n用于取消默认的打印操作。当选项-n和命令p同时出现时,sed可打印选定的内容。
选项-r用于在脚本中使用扩展的规则表达式1
2
3
4
5
6
7
8 从文件file.txt中找到合适的电话号码:xxx-xxx-xxxx or (xxx) xxx-xxxx
] sed -n -r '/^([0-9]{3}-|\([0-9]{3}\) )[0-9]{3}-[0-9]{4}$/ p' file.txt
从文件mail.txt中找到合适的邮箱地址
] sed -n -r '/^[0-Z_]{3,}@(\.[0-Z]{2,})+$/ p' mail.txt
从文件ip.txt中找到合适的ip地址
] sed -n -r '/^$/ p' ip.txt
2. wc
功能: 用于统计文本文件的字节数、单词数和行数。
参数: -c统计字节数, -w统计单词数, -l统计行数。
3. uniq
功能: uniq 用于报告或忽略文件中的重复行
参数:
-c 在行首显示该行重复出现的次数;
-d 仅输出文件中重复行的内容;
-u 仅显示不重复的行的内容;
注意:
(1)uniq仅能对有序文件进行去除重复行的操作
(2)uniq要求文件中的各个字段用空白分割开
4. sort
功能: 将文件进行排序,并将排序结果输出到标准输出。
参数:
-k 位置1 设置比较关键字的位置。关键字的默认位置为1
-r 反序排序
-m 合并已排序的文件,不执行排序操作
-o 将排序结构保存到输出文件中
5. comm
功能: 以行为单位比较两个文件,并将比较结果显示到标准输出。
参数:
-1 不显示在第一个文件中出现的内容
-2 不显示在第二个文件中出现的内容
-3 不显示同时在两个文件中都出现的内容
6. cut
功能: 将文本按列进行切分,也可以指定分隔每列的定界符。
参数:
| 参数 | +说明 | +
|---|---|
| -b <起始字节-结束字节> | +仅显示行中指定字节范围的内容 | +
| -c <起始字符-结束字符> | +仅显示行中指定范围的字符 | +
| -d <分隔符> | +设置字段的分隔符 | +
| -f <起始字段-结束字段> | +显示指定的字段内容 | +
1 |
|
7. tr
功能: 对来自标准输入的内容进行字符替换、字符删除以及重复字符压缩
参数: tr [options] set1 set2
说明: 将来自stdin的输入字符从set1映射到set2,然后将输出写入stdout(标准输出)。set1和set2是字符类或字符集。如果两个字符集的长度不相等,那么set2会不断重复其最后一个字符,直到长度与set1相同。
1 | 字符替换,由大写转换成小写 |
8. awk
(1)简介:awk 是一个强大的文本分析工具,相对于grep的查找,awk在其对数据分析并生成报告时,显得尤为强大。awk 有3个不同版本:awk、nawk和gawk。一般指gawk,gawk是awk的GNU版本。
(2)使用方法:awk '{pattern + action}' {filenames}
其中 pattern 表示 awk 在数据中查找的内容,而action是在找到匹配内容时所执行的一系列命令。
awk 语言的最基本功能是在文件或者字符串中基于指定规则浏览和抽取信息,awk抽取信息后,才能进行其他文本操作。完整的awk脚本通常用来格式化文本文件中的信息。
通常,awk是以文件的一行为处理单位,awk每接收文件的一行,然后执行相应的命令,来处理文本。
(3)调用awk
有三种方式调用awk:1
2
3
4
5
6
7
8
9
10
11
12
131. 命令行方式
awk [-F field-separator] 'command' input-files
其中,commands 是真正awk命令,[-F域分隔符]是可选的。 input-file(s) 是待处理的文件。
在awk中,文件的每一行中,由域分隔符分开的每一项称为一个域。
通常,在不指名-F域分隔符的情况下,默认的域分隔符是空格。
2. shell脚本方式
将所有的awk命令插入一个文件,并使awk程序可执行,然后awk命令解释器作为脚本的首行,一遍通过键入脚本名称来调用。
!/bin/awk
3. 将所有的awk命令插入一个单独文件,然后调用
awk -f awk-script-file input-file(s)
中,-f选项加载awk-script-file中的awk脚本,input-file(s)跟上面的是一样的。
(4)入门实例
注意: awk中的命令需要用大括号{}括起来。
awk 工作流程:[demo@hust#] last -n 5 | awk '{print $1}'
说明: 读入有换行符分割的一条记录,然后将记录按指定的域分隔符划分域、填充域。则$0表示所有域,$1表示第一个域,$n表示第n个域。 默认域分隔符是 空白键、[tab]键。
[demo@hust#] cat /etc/passwd |awk -F ':' 'BEGIN {print "name,shell"} {print $1","$7} END {print "blue,/bin/nosh"}'
说明: 先执行BEGIN,然后读取文件,读入有换行符分割的一条记录,然后将记录按指定的域分隔符划分域、填充域,$0则表示所有域,$1则表示第一个域,$n表示第n个域,随后执行模式所对应的动作action。直到所有的记录都读完,最后执行END操作。
1 | 显示/etc/passwd的账户 |
(5)awk内置变量
awk有许多内置变量用来设置环境信息,这些变量可以被改变,下面给出了最常用的一些变量。1
2
3
4
5
6
7
8
9
10
11ARGC 命令行参数个数
ARGV 命令行参数排列
ENVIRON 支持队列中系统环境变量的使用
FILENAME awk浏览的文件名
FNR 浏览文件的记录数
FS 设置输入域分隔符,等价于命令行 -F选项
NF 浏览记录的域的个数
NR 已读的记录数
OFS 输出域分隔符
ORS 输出记录分隔符
RS 控制记录分隔符
print和printf
awk中同时提供了print和printf两种打印输出的函数。
其中print函数的参数可以是变量、数值或者字符串。字符串必须用双引号引用,参数用逗号分隔。如果没有逗号,参数就串联在一起而无法区分。这里,逗号的作用与输出文件的分隔符的作用是一样的,只是后者是空格而已。
printf函数,其用法和c语言中printf基本相似,可以格式化字符串,输出复杂时,printf更加好用,代码更易懂。
(6)awk 编程
+-
+
变量和赋值
+
awk可以自定义变量+1
2
3
4
5
6
7
8
9统计/etc/passwd的账户人数
count是自定义变量,action{}可以有多个语句,以;号隔开
awk 'BEGIN {count = 0; print "[start] user count is ", count} {count++} END {print "[end] user count is ", count}' /etc/passwd
统计某个文件夹下的文件占有字节数
ls -l | awk 'BEGIN {size = 0;} {size += $5} END {printf("[end] size is %d", size);}'
以M为单位显示
ls -l | awk 'BEGIN {size = 0;} {size = size + $5;} END {print "[end] size is ", size/1024/1024, "M"}'
+条件语句
+
awk中的条件语句是从C语言中借鉴来的
+循环语句
+
awk中的循环语句同样借鉴于C语言,支持while、do/while、for、break、continue,这些关键字的语义和C语言中的语义完全相同。
+数组
+
因为awk中数组的下标可以是数字和字母,数组的下标被称为关键字。
+