一、linux初级工程师基本命令详解
1.1awk命令
awk [options] 'script' var=value file(s)
awk [options] -f scriptfile var=value file(s)
-F fs fs指定输入分隔符,fs可以是字符串或正则表达式
-v var=value 赋值一个用户定义变量,将外部变量传递给awk
-f scriptfile 从脚本文件中读取awk命令
awk命令脚本基本格式
awk 'BEGIN{ commands } pattern{ commands } END{ commands }' file
// 一个awk脚本通常由BEGIN,通用语句块,END语句块组成,三部分都是可选的。
// 脚本通常是被单引号或双引号包住。
awk 'BEGIN{ i=0 } { i++ } END{ print i }' filename
awk "BEGIN{ i=0 } { i++ } END{ print i }" filename
awk变量
$n : 当前记录的第n个字段,比如n为1表示第一个字段,n为2表示第二个字段。
$0 : 这个变量包含执行过程中当前行的文本内容。
ARGC : 命令行参数的数目。
ARGIND : 命令行中当前文件的位置(从0开始算)。
ARGV : 包含命令行参数的数组。
CONVFMT : 数字转换格式(默认值为%.6g)。
ENVIRON : 环境变量关联数组。
ERRNO : 最后一个系统错误的描述。
FIELDWIDTHS : 字段宽度列表(用空格键分隔)。
FILENAME : 当前输入文件的名。
NR : 表示记录数,在执行过程中对应于当前的行号
FNR : 同NR :,但相对于当前文件。
FS : 字段分隔符(默认是任何空格)。
IGNORECASE : 如果为真,则进行忽略大小写的匹配。
NF : 表示字段数,在执行过程中对应于当前的字段数。
print $NF答应一行中最后一个字段 OFMT : 数字的输出格式(默认值是%.6g)。
OFS : 输出字段分隔符(默认值是一个空格)。
ORS : 输出记录分隔符(默认值是一个换行符)。
RS : 记录分隔符(默认是一个换行符)。
RSTART : 由match函数所匹配的字符串的第一个位置。
RLENGTH : 由match函数所匹配的字符串的长度。
SUBSEP : 数组下标分隔符(默认值是34)。
将外部变量值传递给awk
#借助 -v 选项,可以将来自外部值(非stdin)传递给awk
VAR=100
echo | awk -v VARIABLE=$VAR '{ print VARIABLE }'
#定义内部变量接收外部变量
var1="111"
var2="222"
echo | awk '{ print v1,v2 }' v1=$var1 v2=$var2
awk运算
算术运算:(+,-,*,/,&,!,……,++,–)
所有用作算术运算符进行操作时,操作数自动转为数值,所有非数值都变为0
赋值运算:(=, +=, -=,*=,/=,%=,……=,**=)
逻辑运算符: (||, &&)
关系运算符:(<, <=, >,>=,!=, ==)
正则运算符:(~,~!)(匹配正则表达式,与不匹配正则表达式)
awk 'BEGIN{a="100testa";if(a ~ /^100*/){print "ok";}}'
循环结构
for循环
for(变量 in 数组)
{语句}
for(变量;条件;表达式)
{语句}
while循环
while(表达式)
{语句}
do…while循环
do
{语句} while(条件)
awk实例
print & $0
// print是awk打印指定内容的主要命令
$ awk '{print}' /etc/passwd == awk '{print $0}' /etc/passwd
//不输出passwd的内容,而是输出相同个数的空行,进一步解释了awk是一行一行处理文本
$ awk '{print " "}' /etc/passwd
//输出相同个数的a行,一行只有一个a字母
$ awk '{print "a"}' /etc/passwd
$ awk -F":" '{print $1}' /etc/passwd
//将每一行的前二个字段,分行输出,进一步理解一行一行处理文本
$ awk -F: '{print $1; print $2}' /etc/passwd
//输出字段1,3,6,以制表符作为分隔符
$ awk -F: '{print $1,$3,$6}' OFS="\t" /etc/passwd
-f指定脚本文件
//效果与awk -F":" '{print $1}'相同,只是分隔符使用FS在代码自身中指定
$ awk -f script.awk file
BEGIN{
FS=":"
}
{print $1}
$ awk 'BEGIN{X=0} /^$/{ X+=1 } END{print "I find",X,"blank lines."}' test
I find 4 blank lines.
//计算文件大小
$ ls -l | awk 'BEGIN{sum=0} !/^d/{sum+=$5} END{print "total size is",sum}' total size is 17487
-F指定分隔符
// $1 指指定分隔符后,第一个字段,$3第三个字段, \t是制表符
// 一个或多个连续的空格或制表符看做一个定界符,即多个空格看做一个空格
$ awk -F":" '{print $1}' /etc/passwd
// $1与$3相连输出,不分隔
$ awk -F":" '{print $1 $3}' /etc/passwd
// 多了一个逗号,$1与$3使用空格分隔
$ awk -F":" '{print $1,$3}' /etc/passwd
// $1与$3之间手动添加空格分隔
$ awk -F":" '{print $1 " " $3}' /etc/passwd
// 自定义输出
$ awk -F":" '{print "Username:" $1 "\t\t Uid:" $3 }' /etc/passwd
// 显示每行有多少字段
$ awk -F: '{print NF}' /etc/passwd
// 将每行第NF个字段的值打印出来
$ awk -F: '{print $NF}' /etc/passwd
//显示只有4个字段的行
$ awk -F: 'NF==4 {print }' /etc/passwd
//显示每行字段数量大于2的行
$ awk -F: 'NF>2{print $0}' /etc/passwd
//输出每行的行号
$ awk '{print NR,$0}' /etc/passwd
//依次打印行号,字段数,最后字段值,制表符,每行内容
$ awk -F: '{print NR,NF,$NF,"\t",$0}' /etc/passwd
//显示第5行
$ awk -F: 'NR==5{print}' /etc/passwd
//显示第5行和第6行
$ awk -F: 'NR==5 || NR==6{print}' /etc/passwd
//不显示第一行
$ route -n|awk 'NR!=1{print}'
1.2sed命令
sed [选项] '操作' 参数
sed [选项] -f scriptfile 参数
sed命令选项注释
-e或-expression=:表示用指定命令或者脚本来处理输入的文本文件
-f或-file-:表示用指定的脚本文件来处理输入的文件文件
-h或--help:显示帮助
-n、-quite或silent:表示仅表示处理后的结果
-i:直接编辑文本文件
sed命令示例
#输出第三行内容
sed -n '3p' ens33
#输出3-5行内容
sed -n '3,5p' ens33
#输出第三和第五行
sed -n '3p;5p' ens33
#输出所有奇数行 sed -n '1~2p' ens33也可以实现
sed -n 'p;n' ens33
#输出所有偶数行 sed -n '2~2p' ens33也可以实现
sed -n 'n;p' ens33
#输出1-5行的奇数行
sed -n '1,5{p;n}' ens33
#输出1-5的偶数行
sed -n '1,5{2~2p}' ens33
#输出7行以后的偶数行
sed -n '7,${n;p}' ens33
#从第3行开始,连续进行输出即输出3-8行的内容
sed -n '3,+5p' ens33
##结合正则表达式使用
#输出包含the的行
sed -n '/the/p' test.txt
#输出从第四行开始包含the的行
sed -n '4,/the/p' test.txt
#输出包含the的行所在的行号,用(=)来输出行号
sed -n '/the/=' test.txt
#输出PI开头的行
sed -n '/^PI/p' test.txt
#输出以数字0-9为结尾的行
sed -n '/[0-9]$/p' test.txt
#删除以.结尾的行
sed '/\.$/d' test.txt
#删除空行
sed '/^$/d' test.txt
#将每行的第二个l替换为L
sed ‘s/l/L/2’
#将所有的o都替换为空字符
sed 's/o/ /g' test.txt
1.3grep命令
grep格式
grep 参数 关键词 文件名
grep选项参数注释
-c :只输出匹配模式的行数。-h :只显示匹配的行,不显示文件名。-i :忽略匹配时的大小写。-l :只显示文件名列表。-n :显示匹配的行及其行号。-r :显示文件所在目录即路径。-v :输出所有不匹配的行。
-e exp : 指定该选项的表达式,可以多次使用。-f file :指定规则文件,其内容含有一个或多个规则样式,让grep查找符合规则条件的文件内容,格式为每行一个规则样式。-E :将样式为延伸的正则表达式来使用。-w :匹配整个单词。-r :明确要求搜索子目录。-d skip :忽略子目录。-o :只打印匹配行的匹配部分,每个这样的部分在单独的输出行上。
\ :忽略正则表达式中特殊字符的原有含义。[ ]:单个字符,如[A]即A符合要求。[ - ]:范围,如[A-Z],即A、B、C一直到Z都符合要求。.:所有的单个字符。*:所有字符,长度可以为0。
-A n : 除了显示符合范本样式的那一行之外,并显示该行之后n行。-B n : 除了显示符合范本样式的那一行之外,并显示该行之前n行。-C n : 除了显示符合范本样式的那一行之外,并显示该行之前以及之后n行。
grep示例
#查找文件abc.txt中包含字符串"hello"的所有行
grep "hello" abc.txt
常用正则表达式介绍
^:匹配行的开头
$:匹配行的结尾
.:匹配任意字符
*:匹配前面的字符0次或多次
+:匹配前面的字符1次或多次
?:匹配前面的字符0次或1次
[]:匹配中括号中的任意一个字符
[^]:匹配不在中括号中的任意一个字符
#查找文件abc.txt中以"hello"开头的所有行
grep "^hello" abc.txt
#查看匹配行的上下文,可以使用-A、-B和-C选项来指定显示匹配行的后几行、前几行或前后几行。
#要查找文件abc.txt中包含字符串"hello"的行以及它的后两行
grep -A 2 "hello" abc.txt
#grep -n输出时显示行号: 显示匹配行的文件及行号。
grep -n "abc" abc.txt
##[abc]中括号:中括号表达式,[abc]表示匹配中括号中任意一个字符, a或b或c,常见的形式如下:
[a-z]匹配所有小写单个字母[A-Z]匹配所有单个大写字母
[a-zA-Z]匹配所有的单个大小写字母
[0-9]匹配所有单个数字
[a-zA-ZO-9]匹配所有数字和字母
1.4lsof命令
1.1grep命令格式
lsof 选项 文件名
1.2grep选项参数注释
-p pid : 输出指定进程打开的文件;
-l : 输出中使用ID代替用户名;
-u userName : 输出指定用户打开的文件;
-c string : 输出 COMMAND 列中包含 string 的项;
-d fd : 输出包含指定描述符的项;
fileName : 输出打开文件 fileName 的所有项;
1.3lsof实例使用
#列出所有打开的文件:
lsof
备注: 如果不加任何参数,就会打开所有被打开的文件,建议加上一下参数来具体定位
# 查看谁正在使用某个文件
lsof /filepath/file
#递归查看某个目录的文件信息
lsof +D /filepath/filepath2/
备注: 使用了+D,对应目录下的所有子目录和文件都会被列出
# 比使用+D选项,遍历查看某个目录的所有文件信息 的方法
lsof | grep ‘/filepath/filepath2/’
# 列出某个用户打开的文件信息
lsof -u username
备注: -u 选项,u其实是user的缩写
# 列出某个程序所打开的文件信息
lsof -c mysql
备注: -c 选项将会列出所有以mysql开头的程序的文件,其实你也可以写成lsof | grep mysql,但是第一种方法明显比第二种方法要少打几个字符了
# 列出多个程序多打开的文件信息
lsof -c mysql -c apache
# 列出某个用户以及某个程序所打开的文件信息
lsof -u test -c mysql
# 列出除了某个用户外的被打开的文件信息
lsof -u ^root
备注:^这个符号在用户名之前,将会把是root用户打开的进程不让显示
# 通过某个进程号显示该进行打开的文件
lsof -p 1
# 列出多个进程号对应的文件信息
lsof -p 123,456,789
# 列出除了某个进程号,其他进程号所打开的文件信息
lsof -p ^1
# 列出所有的网络连接
lsof -i
# 列出所有tcp 网络连接信息
lsof -i tcp
# 列出所有udp网络连接信息
lsof -i udp
# 列出谁在使用某个端口
lsof -i :3306
# 列出谁在使用某个特定的udp端口
lsof -i udp:55
# 特定的tcp端口
lsof -i tcp:80
# 列出某个用户的所有活跃的网络端口
lsof -a -u test -i
# 列出所有网络文件系统
lsof -N
#域名socket文件
lsof -u
#某个用户组所打开的文件信息
lsof -g 5555
# 根据文件描述列出对应的文件信息
lsof -d description(like 2)
# 根据文件描述范围列出文件信息
lsof -d 2-3
1.4(lsof)命令输出各项注释
COMMAND : 命令名称;
PID : 进程ID;
TID : 线程ID,如果为空代表列出的是进程;
TASKCMD : 任务名称,通常与 COMMAND 相同;
USER : 用户ID号或登录名;
FD : 文件描述符;
TYPE : 与文件关联结点的类型;
DEVICE : 设备号;
SIZE/OFF : 文件大小/偏移量,以字节为单位;
NODE : 文件结点;
NAME : 文件挂载点和文件所在的系统;
1.5tcpdump命令(重点)
1.1tcpdump定义
tcpdump是一个用于截取网络分组,并输出分组内容的工具,转包分析软件。
1.2tcpdump格式
tcpdump [协议类型] [源或目标] [主机名称或IP] [or/and/not/!条件组合] [源或目标] [主机名或IP] [or/and/not/!条件组合] [端口] [端口号] …… [or/and/not/!条件组合] [条件]
1.3选项参数注释
-a #将网络地址和广播地址转变成名字
-A #以ASCII格式打印出所有分组,并将链路层的头最小化
-b #数据链路层上选择协议,包括ip/arp/rarp/ipx都在这一层
-c #指定收取数据包的次数,即在收到指定数量的数据包后退出tcpdump
-d #将匹配信息包的代码以人们能够理解的汇编格式输出
-dd #将匹配信息包的代码以c语言程序段的格式输出
-ddd #将匹配信息包的代码以十进制的形式输出
-D #打印系统中所有可以监控的网络接口
-e #在输出行打印出数据链路层的头部信息
-f #将外部的Internet地址以数字的形式打印出来,即不显示主机名
-F #从指定的文件中读取表达式,忽略其他的表达式
-i #指定监听网络接口
-l #使标准输出变为缓冲形式,可以数据导出到文件
-L #列出网络接口已知的数据链路
-n #不把网络地址转换为名字
-N 不输出主机名中的域名部分,例如www.baidu.com只输出www
-nn #不进行端口名称的转换
-P #不将网络接口设置为混杂模式
-q #快速输出,即只输出较少的协议信息
-r #从指定的文件中读取数据,一般是-w保存的文件
-w #将捕获到的信息保存到文件中,且不分析和打印在屏幕
-s #从每个组中读取在开始的snaplen个字节,而不是默认的68个字节
-S #将tcp的序列号以绝对值形式输出,而不是相对值
-T #将监听到的包直接解析为指定的类型的报文,常见的类型有rpc(远程过程调用)和snmp(简单网络管理协议)
-t #在输出的每一行不打印时间戳
-tt #在每一行中输出非格式化的时间戳
-ttt #输出本行和前面以后之间的时间差
-tttt #在每一行中输出data处理的默认格式的时间戳
-u #输出未解码的NFS句柄
-v #输出稍微详细的信息,例如在ip包中可以包括ttl和服务类型的信息
-vv#输出相信的保报文信息
1.4tcpdump实例使用
#默认监听在第一块网卡,监听所有经过此网卡的数据包
tcpdump
#监听指定网卡ens33的所有传输数据包
tcpdump -i ens33
#监听指定的主机
tcpdump -i eth0 -nn 'host 192.168.10.1'
#监听指定端口
tcpdump -i eth0 -nnA 'port 80'
#抓取特定目标ip和端口的包
tcpdump host 192.168.10.1 and tcp port 8080
#抓取所有经过 eth0,目的端口是 22 的网络数据
tcpdump -i eth0 dst port 22
#抓取所有经过 eth0,目的地址是 192.168.10.10 或 192.168.10.20 端口是 80 的 TCP 数据
tcpdump -i eth0 '((tcp) and (port 80) and ((dst host 192.168.10.00) or (dst host 192.168.10.20)))'
#抓取所有经过 eth1,目标 MAC 地址是 00:01:02:03:04:05 的 ICMP 数据
tcpdump -i eth1 '((icmp) and ((ether dst host 00:01:02:03:04:05)))'
#抓取所有经过 eth1,目的网络是 192.168,但目的主机不是 192.168.10.200的 TCP 数据
tcpdump -i eth1 '((tcp) and ((dst net 192.168) and (not dst host 192.168.10.20)))'
###显示所有已建立的连接,使用netstat命令
netstat -a | grep ESTABLISHED
###显示所有处于侦听状态的TCP连接
netstat -a | grep tcp | grep LISTEN
本文详细介绍了Linux初级工程师需要掌握的基本命令,包括awk命令的脚本格式、变量、运算和实例,sed命令的选项注释、示例,grep命令的格式、选项参数、正则表达式以及实例,lsof命令的格式、选项参数和使用示例,以及tcpdump命令的定义、格式、选项参数及其在抓包分析中的应用。通过这些命令的学习,可以帮助读者深入理解Linux系统的日常运维工作。

957

被折叠的 条评论
为什么被折叠?



