linux文本操作

171 阅读7分钟

前言

在linux中,一切在文件。最常见的就是文本文件了,不管是修改配置文件,查询日志等,都需要对文本文件进行操作。这里记录一些常见的文本处理命令及常用参数。

文本查看
cat

这是最常见的查看文本命令了,但是cat会打开整个文件,如果文件比较大的话不太方便查看内容。

cat filename

less

less可以浏览整个文件而不会加载整个文件,可以在查看中进行搜索,向前或向后翻页。

  • -i 忽略搜索时的大小写
  • -m 显示百分比
  • -N 显示行号
  • /pattern 向后搜索pattern
  • ?pattern 向前搜索pattern
  • n/N 向前/后一个搜索项
  • h 显示帮助
  • Q 退出less命令

less filename

less -i filename

文本查找
grep

grep 命令用于查找文件里符合条件的字符串。支持正则表达式搜索,功能很强大。

  • -A<lines> 显示匹配行之后的内容
  • -B<lines> 显示匹配行之前的内容
  • -C<lines> 显示匹配行前后lines行的内容
  • -c 计算匹配行的列数
  • -i 忽略大小写
  • -n 显示匹配行的行号
  • -o 只显示匹配pattern部分

grep test filename

grep -i test filename

文本编辑
vim

最基本的文本编辑命令。使用vim分为三种模式。

  • 命令模式

    输入vim就是命令模式状态。此时输入的字母会被识别为命令。

    • i 切换到输入模式,输入字符
    • x 删除当前光标的字符
    • G 移动到文件的最后一行
    • nG 移动到文件的第n行。:set nu 设定vim环境,显示行号
    • gg 移动到文件的第一行
    • dd 删除当前行
    • u 复原前一个动作
    • . 重做前一个动作
    • n<Enter> 光标向下移动n行
    • /word 向下搜索word
    • ?word 向上搜索word
    • n/N 向后/前搜索匹配项
    • : 切换到底线命令模式,在最低一行输入命令。
  • 输入模式

    通常可以在命令模式下使用i进入输入模式。也可以使用a或者o

    • esc 退出输入模式,切换到命令模式
  • 底线命令模式

    命令模式下使用进入底线命令模式

    • q 退出程序
    • w 保存文件
    • ! 强制执行,通常配合q退出而不保存修改
awk

AWK 是一种处理文本文件的语言,是一个强大的文本分析工具。可以执行脚本命令

  • -F fs 指定文件分割符
  • -f 从指定文件读取awk命令
  • 传送门
sed

sed命令是利用脚本来处理文本文件

  • -e<script> 以选项中指定的脚本来处理输入的文本文件
  • -f<script_file> 以选项中指定的脚本文件来处理输入的文本文件
  • a 新增,在匹配行之后追加字符串(可以包含换行符)
  • c 取代
  • d 删除
  • i 插入
  • p 打印
  • s 取代,配合正则表达式使用。

高级应用

  • grep 更适合单纯的查找或匹配文本
  • sed 更适合编辑匹配到的文本
  • awk 更适合格式化文本,对文本进行较复杂格式处理
  • awk脚本,BEGIN{执行前的语句} END{最后要执行的语句} {处理每一行需要执行的语句},例如awk BEGIN{script} {script} END{script} filename

补充

locate

locate命令用于查找符合条件的文档,他会去保存文档和目录名称的数据库(一般文件数据库在/var/lib/slocate/slocate.db,并不是实时的,默认每天更新一次updatedb)内,查找合乎范本样式条件的文档或目录

  • -b 仅匹配路径名的基本名称
  • -c 只输出找到的数量
  • -i 忽略大小写

locate filename

示例

gc.txt文件,内容如下

2015-05-22T10:05:34.983+0800: 30.152: [GC (Allocation Failure) [PSYoungGen: 191733K->1955K(185856K)] 450466K->262170K(535552K), 0.0105858 secs] [Times: user=0.02 sys=0.01, real=0.01 secs] 
2015-05-22T10:05:36.847+0800: 32.016: [GC (allocation Failure) [PSYoungGen: 185763K->1213K(225280K)] 445978K->262938K(574976K), 0.0076392 secs] [Times: user=0.01 sys=0.00, real=0.01 secs] 
2015-05-22T10:05:38.047+0800: 33.216: [GC (GCLocker Initiated GC) [PSYoungGen: 179901K->36176K(209920K)] 441627K->366777K(559616K), 0.0217424 secs] [Times: user=0.06 sys=0.02, real=0.02 secs] 
2015-05-22T10:05:38.069+0800: 33.238: [Full GC (Ergonomics) [PSYoungGen: 36176K->0K(209920K)] [ParOldGen: 330601K->116177K(367104K)] 366777K->116177K(577024K), [Metaspace: 75699K->75696K(1118208K)], 0.1854452 secs] [Times: user=0.36 sys=0.03, real=0.19 secs] 
2015-05-22T10:05:55.400+0800: 50.569: [GC (GCLocker Initiated GC) [PSYoungGen: 237573K->36478K(284672K)] 502269K->370081K(651776K), 0.0166221 secs] [Times: user=0.06 sys=0.00, real=0.01 secs] 
2015-05-22T10:05:55.416+0800: 50.586: [Full GC (Ergonomics) [PSYoungGen: 36478K->0K(284672K)] [ParOldGen: 333603K->119194K(481792K)] 370081K->119194K(766464K), [Metaspace: 77703K->77703K(1122304K)], 0.1420304 secs] [Times: user=0.28 sys=0.02, real=0.14 secs] 
2015-05-22T10:06:03.525+0800: 58.694: [GC (allocation Failure) [PSYoungGen: 260591K->3676K(285696K)] 551777K->296303K(767488K), 0.0059039 secs] [Times: user=0.01 sys=0.00, real=0.01 secs] 
2015-05-22T10:06:14.910+0800: 70.079: [GC (GCLocker Initiated GC) [PSYoungGen: 247450K->40407K(291840K)] 547414K->408319K(773632K), 0.0422503 secs] [Times: user=0.13 sys=0.03, real=0.04 secs] 
2015-05-22T10:06:16.162+0800: 71.331: [GC (Allocation Failure) [PSYoungGen: 283095K->40577K(281600K)] 651051K->478092K(763392K), 0.0413905 secs] [Times: user=0.09 sys=0.07, real=0.04 secs] 
2015-05-22T10:06:16.203+0800: 71.372: [Full GC (Ergonomics) [PSYoungGen: 40577K->0K(281600K)] [ParOldGen: 437514K->119669K(560128K)] 478092K->119669K(841728K), [Metaspace: 78514K->78514K(1122304K)], 0.2974272 secs] [Times: user=0.78 sys=0.03, real=0.30 secs] 
2015-05-22T10:06:33.599+0800: 88.768: [GC (GCLocker Initiated GC) [PSYoungGen: 275597K->39300K(282624K)] 574788K->406440K(842752K), 0.0319523 secs] [Times: user=0.08 sys=0.04, real=0.04 secs] 
2015-05-22T10:06:34.363+0800: 89.532: [GC (allocation Failure) [PSYoungGen: 266628K->5757K(288256K)] 667827K->407711K(848384K), 0.0072306 secs] [Times: user=0.02 sys=0.00, real=0.01 secs] 
2015-05-22T10:06:34.917+0800: 90.086: [GC (Allocation Failure) [PSYoungGen: 233085K->38729K(282112K)] 635039K->509713K(842240K), 0.0293082 secs] [Times: user=0.08 sys=0.03, real=0.03 secs] 
2015-05-22T10:06:34.946+0800: 90.115: [Full GC (Ergonomics) [PSYoungGen: 38729K->0K(282112K)] [ParOldGen: 470983K->155377K(660480K)] 509713K->155377K(942592K), [Metaspace: 79085K->79085K(1122304K)], 0.1540893 secs] [Times: user=0.31 sys=0.02, real=0.16 secs] 
2015-05-22T10:06:36.217+0800: 91.386: [GC (Allocation Failure) [PSYoungGen: 224256K->2287K(286720K)] 379633K->157672K(947200K), 0.0054869 secs] [Times: user=0.01 sys=0.00, real=0.01 secs] 
2015-05-22T10:06:37.070+0800: 92.239: [GC (Allocation Failure) [PSYoungGen: 226543K->36204K(283136K)] 381928K->261584K(943616K), 0.0153379 secs] [Times: user=0.05 sys=0.00, real=0.01 secs] 

  1. 查询2015/05/22 10:06:34 - 2015/05/22 10:06:37的日志

    grep '2015-05-22T10:06:3[3-7]' gc.txt 
    # grep '10:06:3[3-7]' gc.txt
    # grep匹配结果默认区分显示
    # sed -n /10:06:3[3-7]/p gc.txt
    # awk '/10:06:3[3-7]/' gc.txt
    
  1. 查询匹配数据的行数

    awk '/10:06:3[3-7]/' gc.txt | wc
    # 截取前三行到临时文件
    # awk '/10:06:3[3-7]/' gc.txt | nl | awk '$1 < 4' > temp.txt