linux 常用命令

linux常用命令

文件内容查看命令

文件查看命令主要为cat 、more、less。关于这几个命令在文件命令写得比较详细,大家可以参考。

个人对以上几个命令进行了基本实践操作

cat

  • 1 创建文章不清除原有内容 cat>>filename 创建之后可直接进行编辑,如果是已存在的文件,则是在原有内容下面进行内容新增(退出cat可以直接按下contral+D),cat filename直接查看内容
➜  Desktop cat >>test1
test1
hello  test

test 3
➜  Desktop cat >> test1
test 4
➜  Desktop cat test1
test1
hello  test

test 3
test 4
➜  Desktop
  • 2 创建文章清除原有内容 cat >filename,创建之后可以直接进行编辑,如果是已存在的文件,则原有内容会被清空
➜  Desktop cat >test2
test11
测试
➜  Desktop cat >test2
新增
➜  Desktop cat test2
新增

所有 cat >>与cat >的区别是对文件原有内容的处理不一样,如果是不想要原有内容则可以直接用cat > ,如果想要原有内容则用cat >>.为了保险起见还是建议用cat >>命令,大不了可以对原有内容进行删除

  • 3 文件合并
    cat file1 file2 >>file3 将file1与file2文件合并为file3,如果file3未创建则直接创建,如果已创建则,在原有内容上新增。
➜  Desktop cat test1 test2 >>test3
➜  Desktop cat test3
test1
hello  test

test 3
test 4
新增
➜  Desktop cat >> test3
我再式下
➜  Desktop cat test1 test2 >>test3
➜  Desktop cat test3
test1
hello  test

test 3
test 4
新增
我再式下
test1
hello  test

test 3
test 4
新增

同样我们可以用 cat file1 file2 > file3 ,合并时如果file3中有内容,则会被清除,与新建文件是类似。前面都是在一个目录下面进行文章的合并,如果是不同目录,则只需要加上目录路径就可以

➜  study cat /Users/huxy/Desktop/test1 /Users/huxy/code/test4 > test5
➜  study cat test5
test1
hello  test

test 3
test 4
件下

其他

  • 1 cat -n file 列出行号
  • 2 cat -b file 与 -n类似,对空白行不进行编号
  • 3 cat -s file 当遇到有连续两行以上的空白行,就代换为一行的空白行
➜  Desktop cat -n test3
     1  test1
     2  hello  test
     3
     4  test 3
     5  test 4
     6  新增
     7  我再式下
     8  test1
     9  hello  test
    10
    11  test 3
    12  test 4
    13  新增
➜  Desktop cat -b test3
     1  test1
     2  hello  test

     3  test 3
     4  test 4
     5  新增
     6  我再式下
     7  test1
     8  hello  test

     9  test 3
    10  test 4
    11  新增
➜  Desktop cat -s test3
test1
hello  test

test 3
test 4
新增
我再式下
test1
hello  test

test 3
test 4
新增

nl

nl 与cat -n很类似

  • nl testcat7.txt 显示行号(空白行不展示)
  • nl -b a testcat7.txt 显示行号,空白行也展示
  • nl -b a -n rz testcat7.txt 显示行号,行号前面自动补0,统一输出格式
  • nl -b a -n rz -w 3 testcat7.txt 显示固定宽度,现在固定3位数的宽度
➜  Desktop nl test3
     1  test1
     2  hello  test

     3  test 3
     4  test 4
     5  新增
     6  我再式下
     7  test1
     8  hello  test

     9  test 3
    10  test 4
    11  新增



    12  test11
➜  Desktop nl -b test3
➜  Desktop nl -b a test3
     1  test1
     2  hello  test
     3
     4  test 3
     5  test 4
     6  新增
     7  我再式下
     8  test1
     9  hello  test
    10
    11  test 3
    12  test 4
    13  新增
    14
    15
    16
    17  test11
➜  Desktop  nl -b a -n rz test3
000001  test1
000002  hello  test
000003
000004  test 3
000005  test 4
000006  新增
000007  我再式下
000008  test1
000009  hello  test
000010
000011  test 3
000012  test 4
000013  新增
000014
000015
000016
000017  test11
➜  Desktop  nl -b a -n rz -w 3 test3
001 test1
002 hello  test
003
004 test 3
005 test 4
006 新增
007 我再式下
008 test1
009 hello  test
010
011 test 3
012 test 4
013 新增
014
015
016
017 test11

more

more命令与cat类似,cat是展示整个文件,而more则是以一页一页的显示方式来显示内容。在网上有一篇比较好的介绍more命令的文章more

  • 分页获取 more -n file 分页获取
  • 上下翻页 control+f 向下翻n行,control+b 向上翻一行
  • 查看当前行数 按下“=”键
  • 查看user message 加上参数-d
  • 不滚动页面,直接对历史数据进行删除 more -20 -c file可以直接只会直接清屏,不是进行滚动屏幕
  • 按下enter,默认加载往下加载一行( 差点把公司日志搞出去)

less

more命令是一次性加载完所有的记录,二less在查看之前是不会加载整个文件。

  • 分屏查看文件 less filename
  • 查看文件并标识行号 less -N filename
  • 读取文件的百分比、行号及总行数 less -M filename
    在less后面有些后续操作,在网上有些比较好的介绍less
    结合查看日志的情况,进行举例说明
  • 打开日志文件 less filename
  • 定位到最后一行 直接按G键,定位到最后
  • 向上翻页查看记录 control+f

这么多命令有时候压根就记不住,所以就需要按下h来查看具体的帮助

head

head 命令显示开头的几行

  • head filename 显示默认前10行:head test3
  • head -n filename 显示前 n行 head -15 test3
  • head -n k filename 显示前k行 head -n 15 test3
  • head -c n filename 显示文件前n个字节 head -c 10 test3
    head命令的重点是输出文件前面的内容

tail

与head对应的命令就是tail ,查看文章最后几行

  • tail filename 默认查看最后10行 tail test3
  • tail -n filename 查看最后n行 tail -12 test3,如果为正数则是tail +12 test3 从test3的12行开始用
  • tail -f filename 不停读取最新内容,达到实时监视的效果 tail -f test3,control +c 退出监控
  • tail -c filename 输出最后的c字节 tail -c 10 test3
  • tail -f -n 指定刷新的行数tal -f -n 5 test3

现在head 与tail的命令都用了,所以可以联合一起使用。比如

  • head -n filename| tail -k 取filename前n行中的最后k行 比如head -20 test3|tail -5取的是test3中的前20行的最后5行

grep

grep为一个强查询命令,是查询日志常用命令

单个简单查询

  • grep XX filename 检索关键字 grep activityId=1929 citybuy.log 查询日志中所有包行 activityId=1929的日志

  • grep XX filename1 filename2在多个文件中检索关键字

  • grep -v XX filename 不包含关键词的行

  • grep ^XX filename 以指定模式开头行

  • grep -r XX /filename 递归查找,grep -r test /etc etc下面所有包行test都会查找出来

  • grep test$ finlename 以关键词模式结尾的行

  • grep -n XX filename 检索关键字并输出行号 grep activityId=1929 citybuy.log,这样就可以知道具体的行号,可以具体结合tail,head命令查询相关前后日志,或是直接使用grep -A,grep -B来查询前后相关日志,比如查到行号是100,可以用 cat citybuy.log |tail -n +100 |head -n 20,从第100行起的前20行日志。

  • grep -c xx filename 检索关键字出现的次数,grep -c activityId=1929 citybuy.log

  • grep -i XX file 不区分大小写 grep -i activityId=1929 citybuy.log

  • grep -w XX file 匹配必须是整个单词 grep -w activityId=1929 citybuy.log

  • -A,-B,-C检索关键字并输出前、后、前后n行,grep -n activityId=1929 citybuy.log -C 5检索关键字并输出相应的前后5行

  • grep -l XX file1 file2 file3 列出包含关键词的文档,可初步定位到内容在哪个文件 grep -l '"branchId":8' citybuy.log citybuy.log.2018-07-02 结果是会列出包行branchId:8的文件,如果是L,则是未匹配到关键词的文件

  • grep -f file1 file2 找出file2中存在的file1中的元素,如果有重复值也正常输出,其实就类似与两个文件中的交集,同样 grep -v -file1 file2 就是取在file2中不在file1中,有重复值时也全部不展示。有种取差集的概念。

多个查询

或查询

grep -E 'xx1|xx2' filename 在filename 中查询包含关键字xx1或是xx2的记录,grep -c -E 'activityId=1929|"branchId":8' citybuy.log。

或者直接是使用egrep -c 'activityId=1929|"branchId":8' citybuy.log

或者使用grep -e activityId=1929 -e "branchId":8 filename

与查询

grep XX1 filename |gep XX2 查找同时包含关键字xx1与xx2的行
例如 grep activityId=1929 citybuy.log|grep "branchId":8'找出日志中含有branchId为8且activityId为 1929的日志

grep -E 'pattern1.pattern2' filename grep -E 'activityId=1929."branchId":8' citybuy.log 这个是有顺序的,先pattern1然后才是pattern2.

grep -E 'pattern1.pattern2|pattern2.pattern1' filename可以实现查询包含pattern1,pattern2的文件。

正则表达式

在使用grep命令时经常用到的就是正则表达式,在网上找到了一篇文章对此进行了说明grep 正则表达式

pattern正则表达式主要参数:


    \: 忽略正则表达式中特殊字符的原有含义。
    
    ^:匹配正则表达式的开始行。
    
    $: 匹配正则表达式的结束行。
    
    \<:从匹配正则表达式的行开始。
    
    \>:到匹配正则表达式的行结束。
    
    [ ]:单个字符,如[A]即A符合要求 。
    
    [ - ]:范围,如[A-Z],即A、B、C一直到Z都符合要求 。
    
    .:所有的单个字符。
    
    * :有字符,长度可以为0。
其他操作

以上都是对grep的搜索功能进行说明,有的时候我们是需要对日志进行二次分析的,所以会将过滤数据进行存储

cat -n info.log |grep "XX" >xxx.txt 将过滤出的日志进行存储

cat -n info.log |grep "XX" |more 内容过多时进行可以加more进行分页查看

awk

awk 命令是行处理器,对行的定义是/n来区分。可以对行进行分割取值,然后获取对应的值。通过查阅相关资料,有篇文章对此描述还不错awk 命令。awk 入门

分割打印基本使用

默认是空格进行分割,可用 -F‘ XX’进行分割,0是全部,1是分割后得到的第一个参数,$2是分割后得到的第二个参数,以此类推,当然还可以按一定格式进行打印

➜  ~ cat test3
2 this is a tes
3 Are you like awk
This's a test
10 there are orange,apple ,mongo
测试
我们不一样
哈哈哈   ,我去
测试,哈哈
test , test
➜  ~ awk '{print $0,$1, $3}' test3
2 this is a tes 2 is
3 Are you like awk 3 you
This's a test This's test
10 there are orange,apple ,mongo 10 are
测试 测试
我们不一样 我们不一样
哈哈哈   ,我去 哈哈哈
测试,哈哈 测试,哈哈
test , test test test
➜  ~ awk '{printf"%-8s %-10s\n", $1,$4}' test3
2        a
3        like
This's
10       orange,apple
测试
我们不一样
哈哈哈
测试,哈哈
test
➜  ~ awk -F ',' '{print $1,$2}' test3
2 this is a tes
3 Are you like awk
This's a test
10 there are orange apple
测试
我们不一样
哈哈哈   ,我去
测试,哈哈
test   test

内建变量

内建变量有多种,下面就些最基本的进行测试。

  • FILENAME 文件名
  • FNR 各文件分别计数的行号
  • FS 字段分割符
  • NF 一条记录字段数目
  • NR 已经读出的记录数,即行号,从1开始
awk 'BEGIN{printf "%4s %4s %4s %4s %4s \n","FILENAME","FNR","FS","NF","NR";printf "---------------------------------------------\n"} {printf "%4s %4s %4s %4s %4s  \n",FILENAME,FNR,FS,NF,NR}'  test3
FILENAME  FNR   FS   NF   NR
---------------------------------------------
test3    1         5    1
test3    2         5    2
test3    3         3    3
test3    4         5    4
test3    5         1    5
test3    6         1    6
test3    7         2    7
test3    8         1    8
test3    9         3    9

正则匹配

字符匹配有2种

  • 纯字符直接匹配 //纯字符匹配 !//纯字符不匹配
  • 字段值匹配 ~//字段值匹配 !~//字段值不匹配
➜  ~ awk '/are/' test3
10 there are orange,apple ,mongo
➜  ~ awk !'/are/' test3
2 this is a tes
3 Are you like awk
This's a test
测试
我们不一样
哈哈哈   ,我去
测试,哈哈
test , test
➜  ~ awk '$2 ~/Are|this/ {print $0}' test3
2 this is a tes
3 Are you like awk
➜  ~ awk '$2 !~/Are|this/ {print $0}' test3
This's a test
10 there are orange,apple ,mongo
测试
我们不一样
哈哈哈   ,我去
测试,哈哈
test , test

条件表达式

== != > >=用于过滤

~ awk '$1==3||$1=="测试"' test3
3 Are you like awk
测试
➜  ~ awk '$1!=3||$1!="测试"' test3
2 this is a tes
3 Are you like awk
This's a test
10 there are orange,apple ,mongo
测试
我们不一样
哈哈哈   ,我去
测试,哈哈
test , test
➜  ~ awk '$1>3' test3
This's a test
10 there are orange,apple ,mongo
测试
我们不一样
哈哈哈   ,我去
测试,哈哈
test , test

逻辑运算符

&& || 多条件过滤

➜  ~ cat test3
2 this is a tes
3 Are you like awk
This's a test
10 there are orange,apple ,mongo
测试
我们不一样
哈哈哈   ,我去
测试,哈哈
test , test
test1  test2 hahah
test1  test3 go
test   test
➜  ~ awk '$1 ~/test/||$2~/test2/' test3
test , test
test1  test2 hahah
test1  test3 go
test   test
➜  ~ awk '$1 ~/test/&&$2!~/test2/' test3
test , test
test1  test3 go
test   test

条件语句
if语句与while 语句


➜  ~ awk 'BEGIN {A=1}{while (A10){ A++} else{B++}} END {print A,"\t"B}' test3
9   3
➜  ~ awk 'BEGIN {A=1}{while (A

之所以学习以上几个命令,其实是源于日志查询的需要。
对某个字段出现次数进行统计

~ awk -F ' ' '{sum[$1]++} END{for (i in sum) print i "\t" sum[i]}' test3
2   1
3   1
哈哈哈 1
This's  1
测试  1
10  1
我们不一样   1
测试,哈哈   1
test1   2
test    2

 sum[$i] 为对第一列中字符出现的次数进行统计

grep与awk 结合使用

zgrep 'com.gexin.rp.base.log.LogManager.slow' rp-slow-20171212-0.log.gz |awk -F':' '{print($1)}'|sort|uniq -c|sort -t' ' -k1n

以上命令的意思就是包含 查找包含com.gexin.rp.base.log.LogManager.slow每行日志,按照: 分域后取第一个域的值,并计算对应的的总数按照统计值从大到小排列

zgrep 'save_list_body|QX3GgC1oXf9IYWX1LCPVE8' *rp-message-20171211* | awk -F'|' '{print($6)}' | awk -F'=' '{print($5)}'|sort| uniq -c | more



zgrep 'QX3GgC1oXf9IYWX1LCPVE8' *rp-bi-20180105* |grep 'RASL'|grep '2018-01-05 '|wc -l

sort 命令补充

cat file1.txt file2.txt | sort | uniq > file.txt 并集
cat file1.txt file2.txt | sort | uniq -d >file.txt 交集
 差集:求file1.txt相对于file2.txt的差集,可先求出两者的交集temp.txt,然后在file1.txt中除去temp.txt即可。

     cat file1.txt file2.txt | sort | uniq -d >temp.txt

     cat file1.txt temp.txt | sort | uniq -u >file.txt

自己在网上查到一篇关于sort命令sort命令

你可能感兴趣的:(linux 常用命令)