本系列会将《鸟哥的Linux私房菜-基础版》中的一些个人觉得比较有用的命令行单独摘出来,方便查阅
grep的各种骚操作
dmesg | grep -n --color=auto 'qxl'
将捕捉到的关键字高亮,并且显示行号dmesg|grep -n -A3 -B2 --color-auto 'qxl'
将关键字所在行的前两行和后三行一起高亮显示,带行号grep -vn 'the' regular_express.txt
反向选择,列出没有’the’的行来grep -in 'the' regular_express.txt
不分大小写列出所在行
关于行首与行尾字符^$
grep -n '^the' regular_express.txt
找出只有在行首出现the的行grep -n '^[a-z]' regular_express.txt
找出小写字母开头的行grep -n '^[^a-zA-Z]' regular_express.txt
找出不是字母开头的行,注意第一个和第二个的意义不同,一个是行首的意思,一个是“非”的意思grep -n '\.$'
以小数点结尾的行,注意这里的斜杠是转义,因为.在正则表达式中有其它含义grep -n '^$' regular_express.txt
找出所有空白行(只有行首和行尾)grep -v '^$' /etc/rsyslog.conf -v '^#'
找出文件中的有效配置行(既不是空白行,又不是#开头的注释)grep -n 'o\{2\}' regular_express.txt
找出o连续出现两次的行。注意注意!!!这里大括号之所以加转义符,是因为大括号是Linux中的关键字!!!这点要小心!egrep -v '^$|^#' regular_express.txt
这里的egrep
相当于grep -e
,单引号内的管道是or
的关系。这条命令的意思是显示除去空行和行首为#的那些行
sed参数说明
[dmtsai@study ~]$ sed [-nefr] [动作]
- 选项与参数:
-n
:使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN 的数据一般都会被列出到屏幕上。
但如果加上 -n 参数后,则只有经过 sed 特殊处理的那一行(或者动作)才会被列出来。
-e
:直接在指令列模式上进行 sed 的动作编辑;
-f
:直接将 sed 的动作写在一个文件内,-f filename
则可以执行 filename 内的 sed 动作;
-r
:sed 的动作支持的是延伸型正规表示法的语法。(预设是基础正规表示法语法)
-i
:直接修改读取的文件内容,而不是由屏幕输出。 - 动作说明:
[n1[,n2]]function
n1, n2
:不见得会存在,一般代表『选择进行动作的行数』,举例来说,如果我的动作
是需要在 10 到 20 行之间进行的,则『 10,20[动作行为] 』
function 有底下这些咚咚:
a
:新增, a 的后面可以接字符串,而这些字符串会在新的一行出现(目前的下一行)
c
:取代, c 的后面可以接字符串,这些字符串可以取代 n1,n2 之间的行!
d
:删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
i
:插入, i 的后面可以接字符串,而这些字符串会在新的一行出现(目前的上一行);
p
:打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运作~
s
:取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!
例如 1,20s/old/new/g 就是啦!
sed使用示例
nl /etc/passwd | sed '2,5d'
将/etc/passwd中的内容列出并且打印行号,同时,将第2~5行删除nl /etc/passwd | sed '2d'
只删除第2行nl /etc/passwd | sed '3,$d'
删除从第3行到最后一行,$符代表最后一行nl /etc/passwd | sed '2a drink tea'
会在第2行后面新增一行,内容为“drink tea”sed 's/要被取代的字符串/新的字符串/g'
把这个格式背下来使用即可ifconfig en0 | grep 'inet' | sed 's/^.*inet //g'
将en0网卡输入的信息中心,inet开头的那一行文字的“inet”字符串去掉ifconfig en0 | grep 'inet' | sed 's/^.*inet //g' | sed 's/ *netmask.*$//g'
将IP地址前面的内容和后面的内容都删掉,只显示IPcat /etc/man_db.conf |grep 'MAN' | sed 's/#.*$//g'
获取删掉#注释内容的有效内容cat /etc/man_db.conf |grep 'MAN' | sed 's/#.*$//g' | sed '/^$/d'
获取删掉#注释内容的有效内容,并删除空白行(因为之前被删除掉的注释会变成空行)sed -i 's/\.$/\!/g' regular_express.txt
将regular_express.txt这个文件中以.
结尾的行的这个点换成感叹号,注意本命令会直接修改源文件,属于危险操作,慎用!
printf格式化打印参数
- 格式:
printf '打印格式' 实际内容
- 选项与参数:
关于格式方面的几个特殊样式:
\a
警告声音输出
\b
退格键(backspace)
\f
清除屏幕 (form feed)
\n
输出新的一行
\r
亦即 Enter 按键
\t
水平的 [tab] 按键
\v
垂直的 [tab] 按键
\xNN
NN 为两位数的数字,可以转换数字成为字符。
关于 C 程序语言内,常见的变数格式
%ns
那个 n 是数字, s 代表 string ,亦即多少个字符;
%ni
那个 n 是数字, i 代表 integer ,亦即多少整数字数;
%N.nf
那个 n 与 N 都是数字, f 代表 floating (浮点),如果有小数字数,
假设我共要十个位数,但小数点有两位,即为 %10.2f 啰!
printf示例
printf '%s\t %s\t %s\t %s\t %s\t \n' $(cat printf.txt)
这里的写法其实很类似C语言printf中的占位符,由于printf不是管道命令,因此需要将文件内容事先提取出来给printf作为输入才行
awk命令
awk '条件类型 1{动作 1} 条件类型 2{动作 2} ...' filename
awk命令将文件的每一行以空格或者tab分割成表格形状,在awk的括号内,每一行的每一个字段都有变量名,$1、$2……分别代表第一列、第二列等等,$0代表所有列(一整行)last | awk '{print $1 "\t" $3}'
将last输出的内容的第一列和第三列展示出来,显示时列与列之间使用tab作为分隔符- awk中的内置变量
NF
每一行($0)拥有的字段总数NR
目前awk所处理的是“第几行”的数据FS
目前的分隔字符是什么(默认为空格)
last | awk '{print $1 "\t lines:" NR "\t columns: " NF}'
将会分别显示出当前所处理到的行号和当前行的字段数,内置变量在使用时需要大写,不需要双引号或者$等前缀,直接使用即可cat /etc/passwd | awk '{FS=":"} $3<10 {print $1 "\t" $3}'
使用冒号作为分隔符,取出第三列小于10的那些数据,并且打印第一列和第三列,中间使用tab隔开(此时{FS=":"}是在第二行生效的)cat /etc/passwd | awk 'BEGIN {FS=":"} $3<10 {print $1 "\t" $3}'
使用冒号作为分隔符,取出第三列小于10的那些数据,并且打印第一列和第三列,中间使用tab隔开,使用BEGIN之后,按冒号分割从第一行就开始生效了哦awk做统计的例子……待补充
diff和patch命令
diff
命令用于对比两个文件之间的差异,以行为单位比较-b
忽略一行中,仅有多个空白行的差异,例如about me与about me-B
忽略空白行的差异-i
忽略大小写的不同diff passwd.old passwd.new
列出不同的那行patch
与diff命令密不可分,通常用于将旧文件升级为新文件diff -Naur passwd.old passwd.new > passwd.patch
这个命令会产生一个从旧文件到新文件的补丁,补丁中的内容如果是---
开头,则为旧文件信息,如果是+++
开头,则为新文件信息,跟git的显示方式相同patch -p0 < passwd.path
更新补丁(减去0层目录,也就是新旧数据在同一层目录下)patch -R -p0 < passwd.path
还原更新
cmp命令
cmp
用于比较两个文件,以字节为单位,也可以比较binary filecmp file1 file2
列出第一个发现的不同点cmp -l file1 file2
将所有不同点的字节处都列出来