本文总结一些在开发中常用到的Linux命令。
1. vim
vim命令用于编辑文件。
普通模式(命令行模式)
123456789 | set number/set nu:vim时显示行号 或通过修改vim的配置文件使得每次vim时都显示行号HOME:快速移动到当前行首部END:快速移动到当前行尾部w:移动到下一个单词b:移动到上一个单词:+行号+回车:快速移动到某一行:+$+回车:快速移动到最后一行dd:删除当前行dj:删除当前行和下一行 |
由普通模式进入插入模式
12345 | i:在当前光标处进行编辑I:在行首插入A:在行尾插入o:在当前行后插入一个新行O:在当前行前插入一个新行 |
由插入模式进入普通模式
1 | ESC |
2. grep
grep命令用于查找文件里符合条件的字符串。
1234567891011 | 以nba.txt文件为例:cat nba.txt | grep "curry":查找nba.txt中包含curry字符串的所有行并返回cat nba.txt | grep "curry" -v:查找nba.txt中不包含curry字符串的所有行并返回(第一条的取反)cat nba.txt | grep "CuRry" -i:忽略大小写cat nba.txt | grep "curry" -n:显示匹配到的行号cat nba.txt | grep "curry" -c:统计匹配到的结果行数,不显示搜索结果cat nba.txt | grep "curry" -o:仅显示匹配到的字符串cat nba.txt | grep "curry" -A n:显示搜索行及其向下相邻的n行cat nba.txt | grep "curry" -B n:显示搜索行及其向上相邻的n行cat nba.txt | grep "curry" -C n:显示搜索行及其向上和向下相邻的n行cat nba.txt | grep "curry" -w:匹配整个单词,区分大小写 |
3. awk
awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。awk语言的最基本功能是在文件或者字符串中基于指定规则浏览和抽取信息。通常,awk是以文件的一行为处理单位的。
有三种方式可以调用awk:
12345678910111213 | A.命令行方式awk [-F field-separator] 'commands' input-file(s)其中,commands 是真正awk命令,[-F域分隔符]是可选的。 input-file(s)是待处理的文件。在awk中,文件的每一行中,由域分隔符分开的每一项称为一个域。通常,在不指名-F域分隔符的情况下,默认的域分隔符是空格。B.shell脚本方式将所有的awk命令插入一个文件,并使awk程序可执行,然后awk命令解释器作为脚本的首行,通过键入脚本名称来调用。相当于shell脚本首行的:#!/bin/sh可以换成:#!/bin/awkC.将所有的awk命令插入一个单独文件,然后调用:awk -f awk-script-file input-file(s)其中,-f选项加载awk-script-file中的awk脚本,input-file(s)是待处理的文件。 |
awk工作流程:读入有’n’换行符分割的一条记录,然后将记录按指定的域分隔符划分域,填充域,$0则表示所有域,$1表示第一个域,$n表示第n个域。默认域分隔符是”空白键” 或 “[tab]键”。
12345678910111213 | 以awk.txt文件为例,文件内容如下:root pts/1 192.168.1.100 Tue Feb 10 11:21 still logged inroot pts/1 192.168.1.100 Tue Feb 10 00:46 - 02:28 (01:41)root pts/1 192.168.1.100 Mon Feb 9 11:41 - 18:30 (06:48)dmtsai pts/1 192.168.1.100 Mon Feb 9 11:41 - 11:41 (00:00)root tty1 Fri Sep 5 14:09 - 14:10 (00:01)[root@slave1 data]# cat awk.txt | awk '{print $1}'rootrootrootdmtsairoot |
下面以/etc/passwd文件为例:
1234567891011121314151617181920212223242526272829 | -F是指定分隔符,head -5只查看前五行[root@slave1 data]# cat /etc/passwd | awk -F ':' '{print $1}' | head -5:rootbindaemonadmlp在所有行添加列名name,shell,在最后一行添加"blue,/bin/nosh",tail -5只查看后五行[root@slave1 data]# cat /etc/passwd | awk -F ':' 'BEGIN {print "name,shell"} {print $1","$7} END {print "blue,/bin/nosh"}' | tail -5name,shellroot,/bin/bashdaemon,/bin/shbin,/bin/shsys,/bin/shroot,/bin/shblue,/bin/nosh搜索/etc/passwd有root关键字的所有行[root@slave1 data]# awk -F: '/root/' /etc/passwd等价于:awk -F ':' '/root/' /etc/passwd等价于:cat /etc/passwd | awk -F ':' '/root/'root:x:0:0:root:/root:/bin/bashoperator:x:11:0:operator:/root:/sbin/nologin搜索/etc/passwd有root关键字的所有行,并显示对应的shell[root@slave1 data]# awk -F: '/root/{print $7}' /etc/passwd /bin/bash/sbin/nologin |
12345678910111213141516171819202122232425 | ARGC 命令行参数个数ARGV 命令行参数排列ENVIRON 支持队列中系统环境变量的使用FILENAME awk浏览的文件名FNR 浏览文件的记录数FS 设置输入域分隔符,等价于命令行 -F选项NF 浏览记录的域的个数NR 已读的记录数OFS 输出域分隔符ORS 输出记录分隔符RS 控制记录分隔符$0变量是指整条记录$1表示当前行的第一个域$2表示当前行的第二个域,以此类推统计/etc/passwd:文件名,每行的行号,每行的列数,对应的第三个域的内容[root@slave1 data]filename:/etc/passwd,linenumber:1,columns:7,linecontent:0filename:/etc/passwd,linenumber:2,columns:7,linecontent:1filename:/etc/passwd,linenumber:3,columns:7,linecontent:2filename:/etc/passwd,linenumber:4,columns:7,linecontent:3filename:/etc/passwd,linenumber:5,columns:7,linecontent:4可以用printf替代print,可以让代码更加简洁,易读:[root@slave1 data]# awk -F ':' '{printf("filename:%s,linenumber:%s,columns:%s,linecontent:%sn",FILENAME,NR,NF,$0)}' /etc/passwd | head -5 |
除了awk的内置变量,awk还可以自定义变量。
12345678910111213141516171819202122232425262728 | 统计/etc/passwd的账户人数:[root@slave1 data]# awk '{count++;print $0;} END {print "user count is", count}' /etc/passwdroot:x:0:0:root:/root:/bin/bashbin:x:1:1:bin:/bin:/sbin/nologindaemon:x:2:2:daemon:/sbin:/sbin/nologinadm:x:3:4:adm:/var/adm:/sbin/nologinlp:x:4:7:lp:/var/spool/lpd:/sbin/nologinsync:x:5:0:sync:/sbin:/bin/syncshutdown:x:6:0:shutdown:/sbin:/sbin/shutdownhalt:x:7:0:halt:/sbin:/sbin/haltmail:x:8:12:mail:/var/spool/mail:/sbin/nologinoperator:x:11:0:operator:/root:/sbin/nologingames:x:12:100:games:/usr/games:/sbin/nologinftp:x:14:50:FTP User:/var/ftp:/sbin/nologinnobody:x:99:99:Nobody:/:/sbin/nologinsystemd-network:x:192:192:systemd Network Management:/:/sbin/nologindbus:x:81:81:System message bus:/:/sbin/nologinpolkitd:x:999:998:User for polkitd:/:/sbin/nologinsshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologinpostfix:x:89:89::/var/spool/postfix:/sbin/nologinntp:x:38:38::/etc/ntp:/sbin/nologinmysql:x:998:1000::/home/mysql:/bin/bashes:x:1000:1001::/home/es:/bin/bashuser count is 21统计当前文件夹下的文件占用的字节数: (注意,统计不包括文件夹的子目录)[root@slave1 data]# ls -l |awk 'BEGIN {size=0;} {size=size+$5;} END {print "[end] size is", size}'[end] size is 36 |
4. sed
sed的作用就是实现对文件的 “ 增删改查 ” 。
sed遵循简单的工作流:
- 读取(从输入中读取某一行)
- 执行(在某一行上执行sed命令)
- 显示(把结果显示在输出中)
默认是显示修改后内容,不会修改原文件,除非使用-i 参数
12345678910111213 | sed [-nefri] 'command' test.txt -e:可以指定多个命令-f:指定命令文件-n:取消默认控制台输出,与p一起使用可打印指定内容-i:输出到原文件,静默执行(修改原文件的意思)-r:Sed使用扩展正则command:a 新增c 替换d 删除i 插入p 打印,要与-n参数一起使用s 替换(局部匹配替换) |
新增 a
12 | sed '2a testContent' test.txt:在第 2 行后面新增一行内容sed '1,3a testContent' test.txt:在原文的第 1~3 行后面各新增一行内容 |
替换 c
12 | sed '2c testContent' test.txt:将第 2 行内容整行替换sed '1,3c testContent' test.txt:将第 1~3 行内容替换成一行指定内容 |
删除 d
12 | sed '2d' test.txt:删除第 2 行sed '1,3d' test.txt:删除第 1~3 行 |
插入 i
12 | sed '2i testContent' test.txt:在第 2 行前面插入一行内容sed '1,3i testContent' test.txt:在原文的第 1~3 行前面各插入一行内容 |
打印 p
1234567 | sed '2p' test.txt:重复打印第 2 行sed '1,3p' test.txt:重复打印第 1~3 行sed -n '2p' test.txt:只打印第 2 行sed -n '1,3p' test.txt:只打印第 1~3 行sed -n '/user/p' test.txt:打印匹配到user的行,类似grepsed -n '/user/!p' test.txt:!反选,打印没有匹配到user的行sed -n 's/old/new/gp' test:只打印匹配替换的行 |
替换 s
123 | sed 's/old/new/' test.txt:匹配每一行的第一个old替换为newsed 's/old/new/gi' test.txt:匹配所有old替换为new,g 代表一行多个,i 代表匹配忽略大小写sed '3,9s/old/new/gi' test.txt:匹配第 3~9 行所有old替换为new |
参数 -e
1 | sed -e 's/aaa/bbb/g' -e '2d' test.txt:执行多个指令 |
参数 -f
1 | sed -f ab.log test.txt:多个命令写进ab.log文件里,一行一条命令,效果同-e,文件的内容就是多行sed命令 |
来源:博客园
作者:吉米喜欢科技
链接:https://www.cnblogs.com/jimmykeji/p/11651669.html