目录
1 Linux基础命令和工具
1.1 grep搜索字符
1.2 find查找文件
1.3 ls显示文件
1.4 wc命令
1.5 ulimit用户资源
1.6 scp远程拷贝
1.7 dos2unix和unix2dos
1.8 sed 行处理
简单模式
替换模式
1.9 awk 列处理
C/C++Linux服务器开发/后台架构师【零声教育】-学习视频教程-腾讯课堂
1 Linux基础命令和工具
1.1 grep搜索字符
grep 命令用于在文件中执行关键词搜索,并显示匹配的效果。部分常用选项
参数 | 作用 |
-c | 仅显示找到的行数 |
-i | 忽略大小写 |
-n | 显示行号 |
-v | 反向选择 – 仅列出没有关键词的行。v 是 invert 的缩写。 |
-r | 递归搜索文件目录 |
-C n | 打印匹配行的前后n行 |
在指定文件查找,查找login关键字
grep login ImUser.cpp
多个文件中搜索
grep login ImUser.cpp MsgConn.cpp
在多个文件搜索的时候,可以使用通配符。在以 cpp结尾的文件中,搜索包含login 的行
grep login *.cpp
递归搜索目录下所有文件, 搜索 msg_server目录下所有文件,打印出包含 login的行。
grep login -r msg_server/
反向查找,查找文件中,不包含 CImUser 的行。
grep -v CImUser ImUser.cpp
找出文件中包含 login的行,并打印出行号
grep -n login ImUser.cpp
找出文件中包含 login的行,打印出行号,并显示前后3行
grep -C 3 -n login ImUser.cpp
找出文件中包含 login的行,打印出行号,并显示前后3行,并忽略大小写
grep -C 3 -i -n login ImUser.cpp
1.2 find查找文件
通过文件名查找文件的所在位置,文件名查找支持模糊匹配
find [指定查找目录] [查找规则] [查找完后执行的action]
常用的操作:
find . -name FILE_NAME
find . -iname FILE_NAME 忽略文件名称大小写
find /etc -maxdepth 1 -name passwd ##查找/etc/下名称中带有passwd的文件,查找一层
find /mnt -size 20K ##查找/mnt文件大小近似20k的文件
find /mnt -size +20K ##查找/mnt文件大小大于20k的文件
find /mnt -size -20K ##查找/mnt文件大小小于20k的文件
find /etc -maxdepth 2 -mindepth 2 -name .conf ##查找/etc/下名称中带有.conf的文件,且只查
找第二层
find /mnt -type d ##按type查找/mnt中目录
find /mnt -type f ##按type查找/mnt中文件
find /mnt -cmin 10 ##查找/mnt中十分钟左右修改的
find /mnt -cmin +10 ##查找/mnt中十分钟以上修改的
find /mnt -cmin -10 ##查找/mnt中十分钟以内修改的
find /mnt -ctime 10 ##查找/mnt中十天左右修改的
find /mnt -ctime +10 ##查找/mnt中十天以上修改的
find /mnt -ctime -10 ##查找/mnt中十天以内修改的
1.3 ls显示文件
-t 可以查看最新修改的时间
-l 每行显示一个条目
-h 可以结合显示文件的GB,MB等(human);
-R 递归显示
-n 显示组id和gid练习:
ls -lt 按最新修改的时间排序,新修改的在前面显示。
ls -ltR 按最新修改的时间排序,新修改的在前面显示,并显示子目录的文件信息
ls -lh 以单位显示文件大小
1.4 wc命令
wc命令用于计算字数。利用wc指令我们可以计算文件的Byte数、字数、或是列数,若不指定文件名称、或是所给予的文件名为"-",则wc指令会从标准输入设备读取数据。
语法
wc [-clw][--help][--version][文件...]
参数:
-c或--bytes或--chars 只显示Bytes数。
-l或--lines 只显示行数。
-w或--words 只显示字数。
--help 在线帮助。
--version 显示版本信息。
练习:
wc testfile # testfile文件的统计信息
7 92 607 testfile # testfile文件的行数为7、单词数92、字节数607
wc -l testfile
1.5 ulimit用户资源
Linux系统对每个登录的用户都限制其最大进程数和打开的最大文件句柄数。为了提高性能,可以根据硬件资源的具体情况设置各个用户的最大进程数和打开的最大文件句柄数。可以用ulimit -a来显示当前的各种系统对用户使用资源的限制:
[root@ubuntu~]# ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 31558
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 31558
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
设置用户的最大进程数:
ulimit -u 1024
设置用户可以打开的最大文件句柄数:
ulimit -n 65530
1.6 scp远程拷贝
secure copy的缩写, scp是linux系统下基于ssh登陆进行安全的远程文件拷贝命令。
scp命令是Linux系统中功能强大的文件传输命令,可以实现从本地到远程,以及从远程到本地的双向文件传输,用起来非常方便,常用来在线上定位问题时将线卜的一些文件下载到本地进行详查,或者将本地的修改上传到服务器上。
使用方式:
sudo apt-get install openssh-server
scp liaoqingfu@122.152.222.180:/home/liaoqingfu/test.txt ./ //下载122.152.222.180的文件
scp mi9.aac liaoqingfu@122.152.222.180:/home/liaoqingfu/ //上传文件到122.152.222.180
scp -r liaoqingfu@122.152.222.180:/home/liaoqingfu/test ./ //下载test整个目录到本地
scp -r test liaoqingfu@122.152.222.180:/home/liaoqingfu/ //上传本地test整个目录到122.152.222.180
1.7 dos2unix和unix2dos
用于转换Windows和UNIX的换行符,通常在Windows系统h开发的脚本和配置,UNIX系统下都需要转换。
使用方式:
dos2unix test.txt
unix2dos test.txt
转换整个目录
find . -type f -exec dos2unix {} \;
find ./ -type f 此命令是显示当前目录下所有的文件
1.8 sed 行处理
命令格式1:sed 's/原字符串/新字符串/' 文件
命令格式2:sed 's/原字符串/新字符串/g' 文件
这两种命令格式的区别在于是否有个“g”。没有“g”表示只替换第一个匹配到的字符串,有“g”表示替换所有能匹配到的字符串,“g”可以认为是“global”(全局的)的缩写,没有“全局的”结尾就不要替换全部。
sed命令是用来批量修改文本内容的,比如批量替换配置中的某个ip。
sed命令在处理时,会先读取一行,把当前处理的行存储在临时缓冲区中,处理完缓冲区中的内容后,打印到屏幕上。然后再读入下一行,执行下一个循环。不断的重复,直到文件末尾。
简单模式
一个简单的sed命令包含三个主要部分: 参数 、 范围 、 操作。要操作的文件,可以直接挂在命令行的最后。
参数
-n 这个参数是 --quiet 或者 --silent 的意思。表明忽略执行过程的输出,只输出我们的结果即可。还有另外一个参数 :
-i 。使用此参数后,所有改动将在原文件上执行。你的输出将覆盖原文件。非常危险,一定要注意。
范围
2,5 表示找到文件中,2,3,4,5行的内容。
这个范围的指定很有灵性,请看以下示例(请自行替换图中的范围部分)。
5 选择第5行。2,5 选择2到5行,共4行。1~2 选择奇数行。2,5 选择2到5行,共4行。1~2 选择奇数行。2~2 选择偶数行。
范围的选择还可以使用正则匹配。请看下面示例。
/void/,+3 选择出现void字样的行,以及后面的三行。
2\^void/,/mem/ 选择以void开头的行,和出现mem字样行之间的数据。
为了直观,下面的命令一一对应上面的介绍,范围和操作之间是可以有空格的。
sed -n '5p' sed1.cpp
sed -n '2,5 p' sed1.cpp
sed -n '1~2 p' sed1.cpp
sed -n '2~2 p' sed1.cpp
sed -n '2,+3p' sed1.cpp
sed -n '2,$ p' sed1.cpp操作
sed -n '/void/,+3 p' sed1.cpp
sed -n '/^void/,/CLIENT_TYPE_FLAG_BOTH/p' sed1.cpp
sed -n '/^BroadcastPdu/,/CLIENT_TYPE_FLAG_BOTH/p' sed1.cpp
sed -n '/^void CImUserManager::BroadcastPdu/,/CLIENT_TYPE_FLAG_BOTH/p' sed1.cpp
操作
最常用的操作就是 p ,意思就是打印。比如,以下两个命令就是等同的:cat file
sed -n 'p' file
除了打印,还有以下操作,我们来说常用的。
p 对匹配内容进行打印。
d 对匹配内容进行删除。这个时候就要去掉 -n
w 将匹配内容写入到其他地方。
sed -n '2,5 p' sed2.cpp
sed '2,5 d' sed2.cpp
sed -n '2,5 w output.txt' sed2.cpp
替换模式
以上是 sed 命令的常用匹配模式,但它还有一个强大的替换模式,意思就是查找替换其中的某些值,并输出结果。使用替换模式很少使用 -n 参数。
替换模式的参数有点多,但第一部分和第五部分都是可以省略的。替换后会将整个文本输出出来。前半部分用来匹配一些范围,而后半部分执行替换的动作。
范围
这个范围和上面的范围语法类似。看下面的例子。
/sys/,+3 选择出现sys字样的行,以及后面的三行。/\^sys/,/mem/ 选择以sys开头的行,和出现mem字样行之间的数据。
具体命令为:
sed -n '/void/,+3 s/void/int/g' sed2.cpp
sed '/^void/,/CLIENT_TYPE_FLAG_BOTH/s/ImUser/User/g' sed2.cpp
命令
这里的命令是指s。也就是substitute的意思。
查找匹配
查找部分会找到要被替换的字符串。这部分可以接受纯粹的字符串,也可以接受正则表达式。看下面的例子。
a 查找范围行中的字符串 a
[a,b,c] 从范围行里查找字符串a或者b或者c。
命令类似:
sed 's/a/b/g' file
sed 's/[a,b,c]/<&>/g' file
替换
是时候把找出的字符串给替换掉了。本部分的内容将替换查找匹配部分找到的内容。
可惜的是,这部分不能使用正则。常用的就是精确替换。比如把a替换成b。
但也有高级功能。和java或者python的正则api类似,sed的替换同样有 Matched Pattern 的含义,同样可以得到Group,不深究。常用的替位符,就是 & 。
&号,再重复一遍。当它用在替换字符串中的时候,代表的是原始的查找匹配数据。
[&] 表明将查找到的数据使用[]包围起来。“&” 表明将查找的数据使用””包围起来。
下面这条命令,将会把文件中的每一行,使用引号包围起来
sed 's/.*/"&"/' file
flag 参数
这些参数可以单个使用,也可以使用多个,仅介绍最常用的。
g 默认只匹配行中第一次出现的内容,加上g,就可以全文替换了。常用。p 当使用了 -n参数, p
将仅输出匹配行内容。w 和上面的w模式类似,但是它仅仅输出有变换的行。i 这个参数比较重要,表示忽略大小写。e 表示将输出的每一行,执行一个命令。不建议使用,可以使用xargs配合完成这种功能。
看两个命令的语法:
sed -n 's/a/b/gipw output.txt' file
sed 's/^/ls -la/e' file
更进一步学习:
https://github.com/BlackGold/Learn/blob/1ee76ca2a9bbbbfe04850a1ccc9b9658e1eb39de/Linux_man_cn/sed.md
1.9 awk 列处理
awk 同 sed 命令类似,只不过 sed 擅长取行, awk 命令擅长取列。
原理:一般是遍历一个文件中的每一行,然后分别对文件的每一行进行处理
用法:
awk [可选的命令行选项] 'BEGIN{命令 } pattern{ 命令 } END{ 命令 }' 文件名
打印某几列
$ echo 'I love you' | awk '{print $3 $2 $1}'
youloveI
我们将字符串 I love you 通过管道传递给awk命令,相当于awk处理一个文件,该文件的内容就是 I love you ,默认通过空格作为分隔符(不管列之间有多少个空格都将当作一个空格处理) I love you 就分割成三列了。
假如分割符号为 . ,可以这样用
$ echo '192.168.1.1' | awk -F "." '{print $2}'
168
条件过滤
我们知道awk的用法是这样的,那么pattern部分怎么用呢?
awk [可选的命令行选项] 'BEGIN{命令 } pattern{ 命令 } END{ 命令 }' 文件名
$ cat score.txt
tom 60 60 60
kitty 90 95 87
jack 72 84 99
$ awk '$2>=90{print $0}' score.txt
kitty 90 95 87
$2>=90 表示如果当前行的第2列的值大于90则处理当前行,否则不处理。说白了pattern部分是用来从文件中筛选出需要处理的行进行处理的,这部分是空的代表全部处理。
pattern部分可以是任何条件表达式的判断结果,例如 >,<,==,>=,<=,!= 同时还可以使用 +,-,*,/ 运算与条件表达式相结合的复合表达式,逻辑 &&,||,! 同样也可以使用进来。另外pattern部分还可以使用 /正则/ 选择需要处理的行。
判断语句
判断语句是写在 pattern{ 命令 } 命令中的,他具备条件过滤一样的作用,同时他也可以让输出更丰富
$ awk '{if($2>=90 )print $0}' score.txt
kitty 90 95 87
$ awk '{if($2>=90 )print $1,"优秀"; else print $1,"良好"}' score.txt
tom 良好
kitty 优秀
jack 良好
$ awk '{if($2>=90 )print $0,"优秀"; else print $1,"良好"}' score.txt
tom 良好
kitty 90 95 87 优秀
jack 良好
BEGIN 定义表头
awk [可选的命令行选项] 'BEGIN{命令 } pattern{ 命令 } END{ 命令 }' 文件名
使用方法如下:
$ awk 'BEGIN{print "姓名 语文 数学 英语"}{printf "%-8s%-5d%-5d%-5d\n",$1,$2,$3,$4}'
score.txt
姓名 语文数学英语
tom 60 60 60
kitty 90 95 87
jack 72 84 99
END 添加结尾符
和BEGIN用法类似
$ echo ok | awk '{print $1}END{print "end"}'
ok
End
数据计算
$ awk 'BEGIN{print "姓名 语文 数学 英语 总成绩"; \
sum1=0;sum2=0;sum3=0;sumall=0} \
{printf "%5s%5d%5d%5d%5d\n",$1,$2,$3,$4,$2+$3+$4;\
sum1+=$2;sum2+=$3;sum3+=$4;sumall+=$2+$3+$4}\
END{printf "%5s%5d%5d%5d%5d\n","总成绩",sum1,sum2,sum3,sumall}'\
score.txt
姓名 语文 数学 英语 总成绩
tom 60 60 60 180
kitty 90 95 87 272
jack 72 84 99 255
总成绩 222 239 246 707
因为命令太长,末尾用 \ 符号换行。
BEGIN体里输出表头,并给四个变量初始化0
pattern体里输出每一行,并累加运算
END体里输出总统计结果
当然了,一个正常人在用linux命令的时候是不会输入那么多格式化符号来对齐的,所以新命令又来了 column -t (鬼知道我为什么会记得这么多乱七八糟的命令。)
范例:网络状态统计
本小节,采用awk统计netstat命令的一些网络状态,来看一下awk语言的基本要素。netstat的输出类似于:
其中,第6列,标明了网络连接所处于的网络状态。我们先给出awk命令,看一下统计结果。
netstat -ant |
awk ' \
BEGIN{print "State","Count" } \
/^tcp/ \
{ rt[$6]++ } \
END{ for(i in rt){print i,rt[i]} }'
netstat -ant |
awk ' \
BEGIN{print "State","Count" } \
/^tcp/ \
{ if($4=="0.0.0.0:3306" ) rt[$6]++ } \
END{ for(i in rt){print i,rt[i]} }'
输出结果为:
State Count
LAST_ACK 1
LISTEN 64
CLOSE_WAIT 43
ESTABLISHED 719
SYN_SENT 5
TIME_WAIT 146
下面这张图会配合以上命令详细说明,希望你能了解awk的精髓。
awk和我们通常的程序不太一样,它分为四个部分。
1、BEGIN 开头部分,可选的。用来设置一些参数,输出一些表头,定义一些变量等。上面的命令仅打
印了一行信息而已。
2、END 结尾部分,可选的。用来计算一些汇总逻辑,或者输出这些内容。上面的命令,使用简单的for
循环,输出了数组rt中的内容。
3、Pattern 匹配部分,依然可选。用来匹配一些需要处理的行。上面的命令,只匹配tcp开头的行,其
他的不进入处理。
4、Action 模块。主要逻辑体,按行处理,统计打印,都可以。
注意点
1、awk的主程序部分使用单引号‘包围,而不能是双引号
2、awk的列开始的index是0,而不是1
更进一步学习:
https://github.com/BlackGold/Learn/blob/1ee76ca2a9bbbbfe04850a1ccc9b9658e1eb39de/Linux_man_cn/awk.md