• Linux Shell重定向 管道命令 awk编程 sed文件操作高阶函数


    在编程中如果能够熟悉shell高阶语法,将对我们进阶为高级程序员有很大的帮助,本文将从Shell重定向 管道命令 awk编程 sed等方面展开介绍。
    作者:有勇气的牛排

    1 shell重定向

    通常情况下,多数unix系统命令从终端接受输入并将产生的结果输出发送回终端。

    一个命令通常从一个标准输入的地方读取,这里恰好终端。同样,一个命令通常将其输出写入到标准输出,治理默认也是终端。

    重定向命令列表

    命令描述
    command > file将输出重定向到file
    conmand < file将输入重定向到file
    n > file将文件描述符为n的文件重定向到file
    n >> file将文件描述符为n的文件,以追加的方式重定向到file
    n >& m将输出文件 m 和 n 合并
    n <& m将输入文件 m 和 n 合并
    << tag将开始标记tag和结束标记tag之间的内容作为输入

    1.1 输出重定向

    >:覆盖到文件
    >>:追加到文件末尾

    实例:使用who命令,将结果保存在who.txt中

    who > who.txt
    
    • 1

    1.2 /dev/null

    这条命令可以让执行的命令,不在屏幕上显示结果(类似于禁止输出),其本质为写一个特殊的文件,但是写的文件都会被抛弃。

    who /dev/null
    
    • 1

    2 linux管道命令

    • 符号:|
    • 管道命令能且仅能处理经由前一个命令传来的正确信息。(不处理错误输出)
    • 在每个管道符号后面接的第一个参数一定是命令,并且该命令必须能够接收标准输入

    哈喽,大家好,我是[有勇气的牛排](全网同名)🐮🐮🐮

    有问题的小伙伴欢迎在文末[评论,点赞、收藏]是对我最大的支持!!!。
    https://www.couragesteak.com/article/348

    实例1:将ls的标准输出,利用cat命令写到文件中

    ls | cat > dirinfo.txt
    
    • 1

    image.png

    实例2:查询指定字符

    人生得意须尽欢,莫使金樽空对月。
    天生我材必有用,千金散尽还复来。
    烹羊宰牛且为乐,会须一饮三百杯。
    岑夫子,丹丘生,将进酒,君莫停。
    与君歌一曲,请君为我侧耳听。
    钟鼓馔玉不足贵,但愿长醉不愿醒。
    古来圣贤皆寂寞,惟有饮者留其名。
    陈王昔时宴平乐,斗酒十千恣欢谑。
    主人何为言少钱,径须沽取对君酌。
    五花马,千金裘,呼儿将出换美酒,与尔同销万古愁。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    cat gushi.txt | grep "请君为我侧耳听"
    
    • 1

    image.png

    实例3:生成一个8位随机密码

    tr -dc A-Za-z0-9_ </dev/urandom | head -c 8 | xargs
    
    • 1

    3 grep 搜索命令

    grep(global search regular expression(RE) and print out the line)

    语法: grep [选项] "搜索内容" 文件名

    -a 不要忽略二进制数据。 
    -A 数字: 列出符合条件的行,并列出后续的n行
    -B 数字: 列出符合条件的行,并列出前面的n行
    -b 在显示符合范本样式的那一行之外,并显示该行之前的内容。 
    -c: 统计找到的符合条件的字符串的次数
    -C<显示列数>或-<显示列数> 除了显示符合范本样式的那一列之外,并显示该列之前后的内容。 
    -d<进行动作> 当指定要查找的是目录而非文件时,必须使用这项参数,否则grep命令将回报信息并停止动作。 
    -e<范本样式> 指定字符串作为查找文件内容的范本样式。 
    -E 将范本样式为延伸的普通表示法来使用,意味着使用能使用扩展正则表达式。 
    -f<范本文件> 指定范本文件,其内容有一个或多个范本样式,让grep查找符合范本条件的文件内容,格式为每一列的范本样式。 
    -F 将范本样式视为固定字符串的列表。 
    -G 将范本样式视为普通的表示法来使用。 
    -h 在显示符合范本样式的那一列之前,不标示该列所属的文件名称。 
    -H 在显示符合范本样式的那一列之前,标示该列的文件名称。 
    -i 忽略字符大小写的差别。 
    -l 列出文件内容符合指定的范本样式的文件名称。 
    -L 列出文件内容不符合指定的范本样式的文件名称。 
    -n 输出行号
    -q 不显示任何信息。 
    -R/-r 此参数的效果和指定“-d recurse”参数相同。 
    -s 不显示错误信息。 
    -v 反向查找
    -w 只显示全字符合的列。 
    -x 只显示全列符合的列。 
    -y 此参数效果跟“-i”相同。 
    -o 只输出文件中匹配到的部分
    --color=auto 搜索出的关键字用颜色显示
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    test.txt

    人生得意须尽欢,莫使金樽空对月。666
    天生我材必有用,千金散尽还复来。666777
    烹羊宰牛且为乐,会须一饮三百杯。
    岑夫子,丹丘生,将进酒,君莫停。
    与君歌一曲,请君为我侧耳听。666
    
    • 1
    • 2
    • 3
    • 4
    • 5

    实例:查询包含666不包括777的句子

    grep "666" test.txt | grep -v "777"
    
    • 1

    实例:查出/usr/local/nginx/logs目录中的所有log文件,并且过滤出包含couragesteak的行。

    find /usr/local/nginx/logs -type f -name "*.log" | xargs grep "couragesteak"
    
    • 1

    4 cut 列提取命令

    语法:cut [选项] 文件名
    -f:列号:提取第几列
    -d:分割符:按照指定分隔符分割列,默认为 “tab” 制表符
    -n:取消分割多字节字符
    -c:字符范围:不依赖分隔符来区分,而是通过字符范围(行首为0)来进行字段提取。“n-”表示从第n个字符到行尾;“n-m”从第n个字符到第m个字符;“一m”表示从第1个字符到第m个字符。
    --complemment:补足被选择的字节、字符或字段
    --out-delimiter:指定输出内容是的字段分割符

    students.txt

    id      name    score
    1       Charles 100 
    2       Tom     99  
    3       Lisa    99	
    
    • 1
    • 2
    • 3
    • 4

    实例:提取第2、3列内容

    cut -f 2,3 student.txt
    
    • 1

    image.png

    实例:提取每行前2个字符

    cut -c -2 student.txt
    
    • 1

    实例:提取第2到最后一个字符

    cut -c 2- student.txt
    
    • 1
    cat student.txt | cut -d "	" -f 1,2
    
    • 1

    5 awk命令

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

    • 多个条件使用{ }进行分割,也可以使用回车符进行分割
    • 如需执行多个命令,可使用回车或; 进行分割
    • 在awk中,变量的赋值与调用都不需要加入 $

    5.1 awk 条件

    条件条件类型描述
    BEGINawk保留字BEGIN作为awk的保留字,其在awk读取数据之前执行,且执行一次。
    ENDawk保留字END作为awk的保留字,与BEGIN的作用相反,其在程序执行结束后,执行的一次动作。
    >关系运算符大于
    <关系运算符小于
    >=关系运算符大于等于
    <=关系运算符小于等于
    ==关系运算符判断是否相等
    !=关系运算符不等于
    A=B关系运算符判断字符串中是否包含B表达式的字串
    A!=B关系运算符判断字符串中是否不包含B表达式的字串
    /正则/正则表达式正则
    5.1.1 BEGIN

    BEGIN作为awk的保留字,其在awk读取数据之前执行,且执行一次。

    实例:

    awk 'BEGIN{printf "先执行我这哦\n"} {printf $2"\n"}' student.txt
    
    • 1

    image.png

    5.1.2 END

    END作为awk的保留字,与BEGIN的作用相反,其在程序执行结束后,执行的一次动作。

    实例:

    awk 'END{printf "程序执行完毕,执行这里哈\n"} {printf $2 "\t" $3 "\n"}' student.txt
    
    • 1

    image.png

    5.1.3 关系运算符

    实例

    cat student.txt | grep -v score | awk '$3 > 99 {printf $2 "\t" $3 "\n"}'
    
    • 1
    5.1.4 正则

    实例:打印Chrles的信息

    awk '/Charles/ {print}' student.txt
    
    • 1

    5.2 awk 内置变量

    内置变量描述
    $0打印所有数据
    $n当前记录的第n列字段
    NF当前所在行总字段数
    NR当前所在行的行号
    # 打印所有数据
    awk '{print $0}' student.txt
    # 当前记录的第n列字段
    awk '{print $n}' student.txt
    # 当前所在行总字段数
    awk '{print NF}' student.txt
    # 当前所在行的行号
    awk '{print NR}' student.txt
    
    # 打印文本文件的总行数 
    awk 'END{print NR}' student.txt
    # 打印文本第一行
    awk 'NR==1{print}' student.txt
    # 打印文本第二行第一列
    sed -n "2, 1p" student.txt | awk '{print $1}'
    
    # 进程查看
    ps -aux | grep watchdog
    # 进程查看 获取第1、2、3列
    ps -aux | grep watchdog | awk '{print $1"\t"$2"\t"$3}'
    # 进程查看 第一行 获取第1、2、3列
    ps -aux | grep watchdog | awk 'NR==1{print $1"\t"$2"\t"$3}'
    
    # 获取行数
    df -h | awk 'END{print NR}'
    
    # 获取最后一行的列数
    ps -aux | grep watchdog | awk 'END{print NF}'
    # 获取最后一列
    ps -aux | grep watchdog | awk 'END{print $NF}'
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    5.3 awk 脚本

    对于简单的命令可以在命令行中解决,但是面对大量从操作时,写成脚本就非常中重要了。

    使用 -f 进行调用

    print.awk

    {print $1"\t"$2"\t"$3}
    
    • 1
    ps -aux | grep watchdog | awk -f print.awk
    
    • 1

    6 sed

    sed命令是利用脚本来处理文本文件,并且可以按照执行编辑文本文件。

    参数说明:
    -e