鸟哥linux命令行总结之——文本提取与格式化处理

本系列会将《鸟哥的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地址前面的内容和后面的内容都删掉,只显示IP
  • cat /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 file
  • cmp file1 file2 列出第一个发现的不同点
  • cmp -l file1 file2 将所有不同点的字节处都列出来
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值