Linux awk命令、split命令、grep命令、wc 命令

Linux 命令大全 Linux 命令大全

AWK 是一种处理文本文件的语言,是一个强大的文本分析工具。

之所以叫 AWK 是因为其取了三位创始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的 Family Name 的首字符。

语法

awk [选项参数] 'script' var=value file(s)

awk [选项参数] -f scriptfile var=value file(s)

选项参数说明:

  • -F fs or –field-separator fs
    指定输入文件折分隔符,fs是一个字符串或者是一个正则表达式,如-F:。
  • -v var=value or –asign var=value
    赋值一个用户定义变量。
  • -f scripfile or –file scriptfile
    从脚本文件中读取awk命令。
  • -mf nnn and -mr nnn
    对nnn值设置内在限制,-mf选项限制分配给nnn的最大块数目;-mr选项限制记录的最大数目。这两个功能是Bell实验室版awk的扩展功能,在标准awk中不适用。
  • -W compact or –compat, -W traditional or –traditional
    在兼容模式下运行awk。所以gawk的行为和标准的awk完全一样,所有的awk扩展都被忽略。
  • -W copyleft or –copyleft, -W copyright or –copyright
    打印简短的版权信息。
  • -W help or –help, -W usage or –usage
    打印全部awk选项和每个选项的简短说明。
  • -W lint or –lint
    打印不能向传统unix平台移植的结构的警告。
  • -W lint-old or –lint-old
    打印关于不能向传统unix平台移植的结构的警告。
  • -W posix
    打开兼容模式。但有以下限制,不识别:/x、函数关键字、func、换码序列以及当fs是一个空格时,将新行作为一个域分隔符;操作符**和**=不能代替^和^=;fflush无效。
  • -W re-interval or –re-inerval
    允许间隔正则表达式的使用,参考(grep中的Posix字符类),如括号表达式[[:alpha:]]。
  • -W source program-text or –source program-text
    使用program-text作为源代码,可与-f命令混用。
  • -W version or –version
    打印bug报告信息的版本。

基本用法

log.txt文本内容如下:

2 this is a test
3 Are you like awk
This's a test
10 There are orange,apple,mongo

用法一:

awk '{[pattern] action}' {filenames}   # 行匹配语句 awk '' 只能用单引号

实例:

# 每行按空格或TAB分割,输出文本中的1、4项
 $ awk '{print $1,$4}' log.txt
 ---------------------------------------------
 2 a
 3 like
 This's
 10 orange,apple,mongo
 # 格式化输出
 $ awk '{printf "%-8s %-10s\n",$1,$4}' log.txt
 ---------------------------------------------
 2        a
 3        like
 This's
 10       orange,apple,mongo
 

用法二:

awk -F  #-F相当于内置变量FS, 指定分割字符

实例:

# 使用","分割
 $  awk -F, '{print $1,$2}'   log.txt
 ---------------------------------------------
 2 this is a test
 3 Are you like awk
 This's a test
 10 There are orange apple
 # 或者使用内建变量
 $ awk 'BEGIN{FS=","} {print $1,$2}'     log.txt
 ---------------------------------------------
 2 this is a test
 3 Are you like awk
 This's a test
 10 There are orange apple
 # 使用多个分隔符.先使用空格分割,然后对分割结果再使用","分割
 $ awk -F '[ ,]'  '{print $1,$2,$5}'   log.txt
 ---------------------------------------------
 2 this test
 3 Are awk
 This's a
 10 There apple

用法三:

awk -v  # 设置变量

实例:

 $ awk -va=1 '{print $1,$1+a}' log.txt
 ---------------------------------------------
 2 3
 3 4
 This's 1
 10 11
 $ awk -va=1 -vb=s '{print $1,$1+a,$1b}' log.txt
 ---------------------------------------------
 2 3 2s
 3 4 3s
 This's 1 This'ss
 10 11 10s

用法四:

awk -f {awk脚本} {文件名}

实例:

 $ awk -f cal.awk log.txt

运算符

运算符 描述
= += -= *= /= %= ^= **= 赋值
?: C条件表达式
|| 逻辑或
&& 逻辑与
~ 和 !~ 匹配正则表达式和不匹配正则表达式
< <= > >= != == 关系运算符
空格 连接
+ – 加,减
* / % 乘,除与求余
+ – ! 一元加,减和逻辑非
^ *** 求幂
++ — 增加或减少,作为前缀或后缀
$ 字段引用
in 数组成员

过滤第一列大于2的行

$ awk '$1>2' log.txt    #命令
#输出
3 Are you like awk
This's a test
10 There are orange,apple,mongo

过滤第一列等于2的行

$ awk '$1==2 {print $1,$3}' log.txt    #命令
#输出
2 is

过滤第一列大于2并且第二列等于’Are’的行

$ awk '$1>2 && $2=="Are" {print $1,$2,$3}' log.txt    #命令
#输出
3 Are you

内建变量

变量 描述
$n 当前记录的第n个字段,字段间由FS分隔
$0 完整的输入记录
ARGC 命令行参数的数目
ARGIND 命令行中当前文件的位置(从0开始算)
ARGV 包含命令行参数的数组
CONVFMT 数字转换格式(默认值为%.6g)ENVIRON环境变量关联数组
ERRNO 最后一个系统错误的描述
FIELDWIDTHS 字段宽度列表(用空格键分隔)
FILENAME 当前文件名
FNR 各文件分别计数的行号
FS 字段分隔符(默认是任何空格)
IGNORECASE 如果为真,则进行忽略大小写的匹配
NF 一条记录的字段的数目
NR 已经读出的记录数,就是行号,从1开始
OFMT 数字的输出格式(默认值是%.6g)
OFS 输出记录分隔符(输出换行符),输出时用指定的符号代替换行符
ORS 输出记录分隔符(默认值是一个换行符)
RLENGTH 由match函数所匹配的字符串的长度
RS 记录分隔符(默认是一个换行符)
RSTART 由match函数所匹配的字符串的第一个位置
SUBSEP 数组下标分隔符(默认值是/034)
$ awk 'BEGIN{printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n","FILENAME","ARGC","FNR","FS","NF","NR","OFS","ORS","RS";printf "---------------------------------------------\n"} {printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n",FILENAME,ARGC,FNR,FS,NF,NR,OFS,ORS,RS}'  log.txt
FILENAME ARGC  FNR   FS   NF   NR  OFS  ORS   RS
---------------------------------------------
log.txt    2    1         5    1
log.txt    2    2         5    2
log.txt    2    3         3    3
log.txt    2    4         4    4
$ awk -F\' 'BEGIN{printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n","FILENAME","ARGC","FNR","FS","NF","NR","OFS","ORS","RS";printf "---------------------------------------------\n"} {printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n",FILENAME,ARGC,FNR,FS,NF,NR,OFS,ORS,RS}'  log.txt
FILENAME ARGC  FNR   FS   NF   NR  OFS  ORS   RS
---------------------------------------------
log.txt    2    1    '    1    1
log.txt    2    2    '    1    2
log.txt    2    3    '    2    3
log.txt    2    4    '    1    4
# 输出顺序号 NR, 匹配文本行号
$ awk '{print NR,FNR,$1,$2,$3}' log.txt
---------------------------------------------
1 1 2 this is
2 2 3 Are you
3 3 This's a test
4 4 10 There are
# 指定输出分割符
$  awk '{print $1,$2,$5}' OFS=" $ "  log.txt
---------------------------------------------
2 $ this $ test
3 $ Are $ awk
This's $ a $
10 $ There $

使用正则,字符串匹配

# 输出第二列包含 "th",并打印第二列与第四列
$ awk '$2 ~ /th/ {print $2,$4}' log.txt
---------------------------------------------
this a

~ 表示模式开始。// 中是模式。

# 输出包含 "re" 的行
$ awk '/re/ ' log.txt
---------------------------------------------
3 Are you like awk
10 There are orange,apple,mongo

忽略大小写

$ awk 'BEGIN{IGNORECASE=1} /this/' log.txt
---------------------------------------------
2 this is a test
This's a test

模式取反

$ awk '$2 !~ /th/ {print $2,$4}' log.txt
---------------------------------------------
Are like
a
There orange,apple,mongo
$ awk '!/th/ {print $2,$4}' log.txt
---------------------------------------------
Are like
a
There orange,apple,mongo

awk脚本

关于 awk 脚本,我们需要注意两个关键词 BEGIN 和 END。

  • BEGIN{ 这里面放的是执行前的语句 }
  • END {这里面放的是处理完所有的行后要执行的语句 }
  • {这里面放的是处理每一行时要执行的语句}

假设有这么一个文件(学生成绩表):

$ cat score.txt
Marry   2143 78 84 77
Jack    2321 66 78 45
Tom     2122 48 77 71
Mike    2537 87 97 95
Bob     2415 40 57 62

我们的 awk 脚本如下:

$ cat cal.awk
#!/bin/awk -f
#运行前
BEGIN {
    math = 0
    english = 0
    computer = 0
 
    printf "NAME    NO.   MATH  ENGLISH  COMPUTER   TOTAL\n"
    printf "---------------------------------------------\n"
}
#运行中
{
    math+=$3
    english+=$4
    computer+=$5
    printf "%-6s %-6s %4d %8d %8d %8d\n", $1, $2, $3,$4,$5, $3+$4+$5
}
#运行后
END {
    printf "---------------------------------------------\n"
    printf "  TOTAL:%10d %8d %8d \n", math, english, computer
    printf "AVERAGE:%10.2f %8.2f %8.2f\n", math/NR, english/NR, computer/NR
}

我们来看一下执行结果:

$ awk -f cal.awk score.txt
NAME    NO.   MATH  ENGLISH  COMPUTER   TOTAL
---------------------------------------------
Marry  2143     78       84       77      239
Jack   2321     66       78       45      189
Tom    2122     48       77       71      196
Mike   2537     87       97       95      279
Bob    2415     40       57       62      159
---------------------------------------------
  TOTAL:       319      393      350
AVERAGE:     63.80    78.60    70.00

另外一些实例

AWK 的 hello world 程序为:

BEGIN { print "Hello, world!" }

计算文件大小

$ ls -l *.txt | awk '{sum+=$5} END {print sum}'
--------------------------------------------------
666581

从文件中找出长度大于 80 的行:

awk 'length>80' log.txt

打印九九乘法表

seq 9 | sed 'H;g' | awk -v RS='' '{for(i=1;i<=NF;i++)printf("%dx%d=%d%s", i, NR, i*NR, i==NR?"\n":"\t")}'

更多内容:

Linux 命令大全 Linux 命令大全

1 篇笔记 写笔记

  1.  

       z977690557

      977***557@qq.com

    102

    awk、sed、grep更适合的方向:

    •  grep 更适合单纯的查找或匹配文本
    •  sed 更适合编辑匹配到的文本
    •  awk 更适合格式化文本,对文本进行较复杂格式处理

    关于awk内建变量个人见解,简单易懂

    解释一下变量:

    变量:分为内置变量和自定义变量;输入分隔符FS和输出分隔符OFS都属于内置变量。

    内置变量就是awk预定义好的、内置在awk内部的变量,而自定义变量就是用户定义的变量。

    •  FS(Field Separator):输入字段分隔符, 默认为空白字符
    •  OFS(Out of Field Separator):输出字段分隔符, 默认为空白字符
    •  RS(Record Separator):输入记录分隔符(输入换行符), 指定输入时的换行符
    •  ORS(Output Record Separate):输出记录分隔符(输出换行符),输出时用指定符号代替换行符
    •  NF(Number for Field):当前行的字段的个数(即当前行被分割成了几列)
    •  NR(Number of Record):行号,当前处理的文本行的行号。
    •  FNR:各文件分别计数的行号
    •  ARGC:命令行参数的个数
    •  ARGV:数组,保存的是命令行所给定的各参数

    自定义变量的方法

    •  方法一:-v varname=value ,变量名区分字符大小写。
    •  方法二:在program中直接定义。

    Linux split命令

    Linux 命令大全 Linux 命令大全

    Linux split命令用于将一个文件分割成数个。

    该指令将大文件分割成较小的文件,在默认情况下将按照每1000行切割成一个小文件。

    语法

    split [--help][--version][-<行数>][-b <字节>][-C <字节>][-l <行数>][要切割的文件][输出文件名]

    参数说明

    • -a : 指定后缀长度
    • -b : 每个文件多少字节,单位可以为k和M
    • -d : 使用数字后缀而不是字母
    • -l : 指定每个文件的行数,默认1000
    • -<行数> : 指定每多少行切成一个小文件
    • –help : 在线帮助
    • –version : 显示版本信息
    • -C<字节> : 与参数”-b”相似,但是在切 割时将尽量维持每行的完整性
    • [输出文件名] : 设置切割后文件的前置文件名, split会自动在前置文件名后再加上编号

    实例

    使用指令”split”将文件”README”每6行切割成一个文件,输入如下命令:

    $ split -6 README       #将README文件每六行分割成一个文件 

    以上命令执行后,指令”split”会将原来的大文件”README”切割成多个以”x”开头的小文件。而在这些小文件中,每个文件都只有6行内容。

    使用指令”ls”查看当前目录结构,如下所示:

    $ ls                                #执行ls指令  
    #获得当前目录结构  
    README xaa xad xag xab xae xah xac xaf xai   
    找出两个文件中相同的数据
     通过cat a b | sort | uniq -d查找
    当然可以通过cat a b | sort | uniq -d查找,如果文件太大的话,需要先对文件拆分再进行查找,一般就是先用split把文件a和文件b分别拆分为比如10个文件,但是比较这些子文件的话是很麻烦的,因为a文件的每个子文件都要和b文件的每个子文件做一遍比较,就是要比较100次,那么能不能只通过比较10次就能得出结果呢?
    

    答案就是在拆分时把每行按照一定的规则放到同一个后缀的子文件下,比如这里我们通过取余的方式来分,111 % 10为1,然后就放到子文件a_1中,那么如果b中有111这行数据的话,肯定也是放在子文件b_1中,这样只要比较a和b的对应子文件就可以了,10次比较就搞定了。

    先用awk分出10个子文件,然后再比较就可以了。

    awk '{mod = $0 % 10}{print >> "a_"mod}{close("a_"mod)}' a
    awk '{mod = $0 % 10}{print >> "b_"mod}{close("b_"mod)}' b

    Linux

     grep 命令

    Linux 命令大全 Linux 命令大全

    Linux grep 命令用于查找文件里符合条件的字符串。

    grep 指令用于查找内容包含指定的范本样式的文件,如果发现某文件的内容符合所指定的范本样式,预设 grep 指令会把含有范本样式的那一列显示出来。若不指定任何文件名称,或是所给予的文件名为 ,则 grep 指令会从标准输入设备读取数据。

    语法

    grep [-abcEFGhHilLnqrsvVwxy][-A<显示行数>][-B<显示列数>][-C<显示列数>][-d<进行动作>][-e<范本样式>][-f<范本文件>][--help][范本样式][文件或目录...]

    参数

    • -a 或 –text : 不要忽略二进制的数据。
    • -A<显示行数> 或 –after-context=<显示行数> : 除了显示符合范本样式的那一列之外,并显示该行之后的内容。
    • -b 或 –byte-offset : 在显示符合样式的那一行之前,标示出该行第一个字符的编号。
    • -B<显示行数> 或 –before-context=<显示行数> : 除了显示符合样式的那一行之外,并显示该行之前的内容。
    • -c 或 –count : 计算符合样式的列数。
    • -C<显示行数> 或 –context=<显示行数>或-<显示行数> : 除了显示符合样式的那一行之外,并显示该行之前后的内容。
    • -d <动作> 或 –directories=<动作> : 当指定要查找的是目录而非文件时,必须使用这项参数,否则grep指令将回报信息并停止动作。
    • -e<范本样式> 或 –regexp=<范本样式> : 指定字符串做为查找文件内容的样式。
    • -E 或 –extended-regexp : 将样式为延伸的正则表达式来使用。
    • -f<规则文件> 或 –file=<规则文件> : 指定规则文件,其内容含有一个或多个规则样式,让grep查找符合规则条件的文件内容,格式为每行一个规则样式。
    • -F 或 –fixed-regexp : 将样式视为固定字符串的列表。
    • -G 或 –basic-regexp : 将样式视为普通的表示法来使用。
    • -h 或 –no-filename : 在显示符合样式的那一行之前,不标示该行所属的文件名称。
    • -H 或 –with-filename : 在显示符合样式的那一行之前,表示该行所属的文件名称。
    • -i 或 –ignore-case : 忽略字符大小写的差别。
    • -l 或 –file-with-matches : 列出文件内容符合指定的样式的文件名称。
    • -L 或 –files-without-match : 列出文件内容不符合指定的样式的文件名称。
    • -n 或 –line-number : 在显示符合样式的那一行之前,标示出该行的列数编号。
    • -o 或 –only-matching : 只显示匹配PATTERN 部分。
    • -q 或 –quiet或–silent : 不显示任何信息。
    • -r 或 –recursive : 此参数的效果和指定”-d recurse”参数相同。
    • -s 或 –no-messages : 不显示错误信息。
    • -v 或 –invert-match : 显示不包含匹配文本的所有行。
    • -V 或 –version : 显示版本信息。
    • -w 或 –word-regexp : 只显示全字符合的列。
    • -x –line-regexp : 只显示全列符合的列。
    • -y : 此参数的效果和指定”-i”参数相同。

    Linux 命令大全 Linux 命令大全

    实例

    1、在当前目录中,查找后缀有 file 字样的文件中包含 test 字符串的文件,并打印出该字符串的行。此时,可以使用如下命令:

    grep test *file 

    结果如下所示:

    $ grep test test* #查找前缀有“test”的文件包含“test”字符串的文件  
    testfile1:This a Linux testfile! #列出testfile1 文件中包含test字符的行  
    testfile_2:This is a linux testfile! #列出testfile_2 文件中包含test字符的行  
    testfile_2:Linux test #列出testfile_2 文件中包含test字符的行 

    2、以递归的方式查找符合条件的文件。例如,查找指定目录/etc/acpi 及其子目录(如果存在子目录的话)下所有文件中包含字符串”update”的文件,并打印出该字符串所在行的内容,使用的命令为:

    grep -r update /etc/acpi 

    输出结果如下:

    $ grep -r update /etc/acpi #以递归的方式查找“etc/acpi”  
    #下包含“update”的文件  
    /etc/acpi/ac.d/85-anacron.sh:# (Things like the slocate updatedb cause a lot of IO.)  
    Rather than  
    /etc/acpi/resume.d/85-anacron.sh:# (Things like the slocate updatedb cause a lot of  
    IO.) Rather than  
    /etc/acpi/events/thinkpad-cmos:action=/usr/sbin/thinkpad-keys--update 

    3、反向查找。前面各个例子是查找并打印出符合条件的行,通过”-v”参数可以打印出不符合条件行的内容。

    查找文件名中包含 test 的文件中不包含test 的行,此时,使用的命令为:

    grep -v test *test*

    结果如下所示:

    $ grep-v test* #查找文件名中包含test 的文件中不包含test 的行  
    testfile1:helLinux!  
    testfile1:Linis a free Unix-type operating system.  
    testfile1:Lin  
    testfile_1:HELLO LINUX!  
    testfile_1:LINUX IS A FREE UNIX-TYPE OPTERATING SYSTEM.  
    testfile_1:THIS IS A LINUX TESTFILE!  
    testfile_2:HELLO LINUX!  
    testfile_2:Linux is a free unix-type opterating system.

    2 篇笔记 写笔记

    1.  

         free-coder

        sun***1@126.com

      132

      场景: 系统报警显示了时间,但是日志文件太大无法直接 cat 查看。(查询含有特定文本的文件,并拿到这些文本所在的行)

      解决:

      grep -n '2019-10-24 00:01:11' *.log

      查看符合条件的日志条目。

      free-coder

         free-coder

        sun***1@126.com

      2年前 (2019-10-23)

    2.  

         XRG

        233***0962@qq.com

      206

      Linux 里利用 grep 和 find 命令查找文件内容

      从文件内容查找匹配指定字符串的行:

      $ grep "被查找的字符串" 文件名

      例子:在当前目录里第一级文件夹中寻找包含指定字符串的 .in 文件

      grep "thermcontact" /.in

      从文件内容查找与正则表达式匹配的行:

      $ grep e "正则表达式" 文件名

      查找时不区分大小写:

      $ grep i "被查找的字符串" 文件名

      查找匹配的行数:

      $ grep -c “被查找的字符串” 文件名

      从文件内容查找不匹配指定字符串的行:

      $ grep v "被查找的字符串" 文件名

      从根目录开始查找所有扩展名为 .log 的文本文件,并找出包含 “ERROR” 的行:

      $ find / -type f -name "*.log" | xargs grep "ERROR"

      例子:从当前目录开始查找所有扩展名为 .in 的文本文件,并找出包含 “thermcontact” 的行:

      find . -name "*.in" | xargs grep "thermcontact"

       

      判断程序运行状态:

      (注意ps -ef 和ps -C两种方法的区别,ps -C可以准确的查询出这个服务名称的条数,而ps -ef 只能匹配有这个名称的进程)

      脚本
      在linux中,对于数字的判断是函数有如下几种

      条件 案例
      -eq n1 -eq n2检查n1是否等于n2
      -le n1 -le n2检查n1是否小于等于n2
      -ge n1 -ge n2检查n1是否大于等于n2
      -lt n1 -lt n2检查n1是否小于n2
      -gt n1 -gt n2检查n1是否大于n2
      -ne n1 -ne n2检查n1是否不等于n2

      
      

      脚本代码
      数字的判断语法,两边是有空格的,不然就会语报错

      #!/bin/bash
      #ps -ef |grep zookeeper 这个就是看zookeeper的启动情况
      #grep -v “grep” 是为了去掉查询 grep的那一条
      #wc -l 是计数的

      COUNT=$(ps -ef |grep zookeeper |grep -v “grep” |wc -l)
      echo $COUNT
      if [ $COUNT -eq 0 ]; then
      echo NOT RUN
      else
      echo is RUN
      fi
      ————————————————

      坑的改过:备份指定目录脚本

      #!/bin/bash
      #ps -ef |grep zookeeper 这个就是看zookeeper的启动情况
      #grep -v “grep” 是为了去掉查询 grep的那一条
      #wc -l 是计数的

      DAY=`TZ=”TAIST+16″ date +%Y-%m-%d-%H%M%S`
      COUNT=$(mount -l |grep 0backup |grep -v “grep” |wc -l)
      #echo $COUNT
      if [ $COUNT -ge 1 ]; then
      echo Aready conecting…
      tar -zcf /mnt/backup/py_sh_bak_$DAY.tgz ./py ./bak ./sh > /mnt/backup/py_sh_bak_$DAY.log
      else
      echo NO RUN
      mount -t cifs //192.168.1.3/tools/0backup /mnt/backup -o user=zenglee,pass=hxx3
      tar -zcf /mnt/backup/py_sh_bak_$DAY.tgz ./py ./bak ./sh > /mnt/backup/py_sh_bak_$DAY.log

      fi

      版权声明:本文为CSDN博主「狂飙的yellowcong」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
      原文链接:https://blog.csdn.net/yelllowcong/article/details/78424329

      linux shell wc命令

      sunnyRube
      字数 381阅读 1,417
      wc命令的功能为统计指定文件中的字节数、字数、行数, 并将统计结果显示输出。
      语法:wc [选项] 文件…说明:该命令统计给定文件中的字节数、字数、行数。如果没有给出文件名,则从标准输入读取。
      wc同时也给出所有指定文件的总统计数。字是由空格字符区分开的最大字符串。该命令各选项含义如下:- c 统计字节数。– l 统计行数。– w 统计字数。这些选项可以组合使用。输出列的顺序和数目不受选项的顺序和数目的影响。总是按下述顺序显示并且每项最多一列。行数、字数、字节数、文件名如果命令行中没有文件名,则输出中不出现文件名。

      例如:

      $ wc – lcwfile1 file2

      4 33 file1

      7 52 file2

      11 11 85 total

      省略任选项-lcw,wc命令的执行结果与上面一样

      示例:

      wc命令用来计算一个文件或者指定的多个文件中的行数,单词数和字符数。如:

      wc filename

      第一列显示行数,第二列显示单词数,第三列显示字符数。

      wc 有四个参数可选,分别是l,c,m,w

      wc -l filename 报告行数

      wc -c filename 报告字节数

      wc -m filename 报告字符数

      wc -w filename 报告单词数