• Linux三剑客


    文档一:
    aaa.txt内容如下
    2018-11-26
    hello world!
    192.168.136.128
    192.168.136.129
    20181127
    2018-12-12
    2018-11-11
    aaa bbb
    文档二:
    student.txt内容如下
    ID Name gender Mark
    1 youyou women 59
    2 abin man 60
    3 tangge women 98
    一、grep:
    1.正则表达式--grep
    正则匹配日期: grep '[0-9]{4}-[0-9]{2}-[0-9]{2}' aaa.txt
    正则匹配IP: grep '[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}' aaa.txt
    2.Cut --过滤文件中的内容
    使用grep查询出想要的内容,然后使用管道二次过滤:
    Cut: cut [选项] 文件名
    选项:
    -f 列号:提取第几列
    -d 分隔符:按照指定分隔符分割列
    注意:默认分隔符是制表符 --tab
    取出student.txt第2列数据: cut -f 2 student.txt
    取出student.txt第2,4列数据: cut -f 2,4 student.txt
    取出非root用户的用户名: grep "/bin/bash" /etc/passwd | grep -v "root" | cut -f 1 -d ":"
    cut命令的局限:
    cut取不出非同一分隔符的字段:如 df -h | cut -d " " -f 1,3
     
    二、printf:(为awk铺垫
     
    输出格式:
    [hadoop@hadoop1 test]$ printf %s 1 2 3 4 5 6
    123456[hadoop@hadoop1 test]$ printf '%s ' 1 2 3 4 5 6
    1
    2
    3
    4
    5
    6
    [hadoop@hadoop1 test]$ printf '%s %s %s ' 1 2 3 4 5 6
    1 2 3
    4 5 6
    输出文件:
    不调整任何输出格式:
    [hadoop@hadoop1 test]$ printf '%s' $(cat student.txt)
    IDNamegenderMark1youyouwomen592abinman603tanggewomen98
    调整格式后:
    [hadoop@hadoop1 test]$ printf '%s %s %s %s ' $(cat student.txt)
    ID Name gender Mark
    1 youyou women 59
    2 abin man 60
    3 tangge women 98
    三、awk:
    在awk命令的输出中支持print和printf命令
    print:print会在每个输出之后自动加入一个换行符(Linux默认没有print命令)
    printf:printf是标准格式输出命令,并不会自动加入换行符,如果需要换行,需要手工加入换行符
     
    awk '条件1{动作1} 条件2{动作2}........' 文件名
    条件:
    一般使用关系表达式作为条件
    x > 10 判断变量 x是否大于10
    x >= 10 大于等于
    x <- 10 小于等于
    动作:
    格式化输出
    流程控制语句
     
    使用awk输出student.txt第2,4列: cut -f 2,4 student.txt
    强大的awk弥补了cut的缺陷:
    awk-BEGIN: 在第一个动作之前加入一个执行一次的动作
    [hadoop@hadoop1 test]$ awk 'BEGIN{printf "This is a transcript "}{printf $2 " " $4 " "}' student.txt
    This is a transcript
    Name Mark
    youyou 59
    abin 60
    tangge 98
    awk-END: 在最后一个动作之后加入一个执行一次的动作
    [hadoop@hadoop1 test]$ awk 'END{printf "The End "}{printf $2 " " $4 " "}' student.txt
    Name Mark
    youyou 59
    abin 60
    tangge 98
     
    The End
     
    awk 对文本的扫描是依行为单位, 这样就产生了一个问题怎么在扫描的开始以及结束之后的执行一些操作?
    awk BEGIN{} 是在文件开始扫描前进行的操作 END {} 是扫描结束后 进行的操作 ;一般的操作都是需要在BEGIN 设置一个初始的量
    shell 换行的使用
    eg:
     
    awk_test.txt
     
    1 line1 field1
    2 line2 field2
    3 line3 field3
    4 line4 field4
    5 line5 field5
    6 line6 field6
    7 line7 field7
    8 line8 field8
    9 line9 field9
    10 line10 field10
    11 line11 field11
     
    awk 'BEGIN{print "地点 ";total=0;} {print $3;total = total+NR} END{printf "行数总计: %2d ", total}' awk_test.txt
     
    四、sed:
    sed是一种几乎包括在所有UNIX平台(包括LInux)的轻量级流编辑器,sed主要是用来将数据进行选取,替换,删除,新增的命令.
    sed [选项] '[动作]' 文件名
    选项:
    -n :一般sed命令会把所有数据都输出到屏幕,如果加入此选择,则只会吧经过sed命令处理的行输出到屏幕
    -e :允许对输入数据应用多条sed命令编辑
    -i :用sed的修改结果直接修改读取数据的文件,而不是由屏幕输出
    动作:
    a :追加,在当前行后添加一行或者多行
    c :行替换,用c后面的字符串替换原数据行
    i :插入,在当前行前插入一行或者多行,
    d:删除,删除指定的行
    p :打印,输出指定的行
    s :字符串替换,用一个字符串替换另一个字符串,格式为 "行范围s/旧字符串/新字符串/g" (和vim中的替换格式类似)
     
    sed行数据操作:
    查看文件的第二行:
    [hadoop@hadoop1 test]$ sed -n '2p' student.txt
    删除第2-4行的数据,但不修改文件本身:
    [hadoop@hadoop1 test]$ sed '2,4d' student.txt
    删除第2-4行的数据,修改文件本身:
    [hadoop@hadoop1 test]$ sed -i '2,4d' student.txt
    在第二行后追加hello world! 不对原文件做编辑:
    sed '2a hello world!' student.txt
    在第二行后追加hello world! 对原文件做编辑:
    sed -i '2a hello world!' student.txt
    在第二行前插入两行数据:
    sed -i '2i hello world!' student.txt
    替换第二行数据:
    替换字符串:
    sed 's/旧字符串/新字符串/g' 文件名
    替换第五行数据60为99
    同时替换youyou 和 abin 为空和为--:
     
  • 相关阅读:
    atitit 提升数据库死锁处理总结
    CoreJava_线程并发(堵塞队列):在某个目录下搜索含有某keyword的文件
    HDU 4389——X mod f(x)(数位DP)
    POJ 1182 (经典食物链 /并查集扩展)
    【iOS-Android开发对照】 之 APP入口
    《Pro Android Graphics》读书笔记之第四节
    Android多个Module统一配置相同jar或库的版本号
    教你上传代码到码云(与github一样)
    解决本地项目推送到码云(github),上提示:failed to push some refs to ...
    android adb常用指令
  • 原文地址:https://www.cnblogs.com/gentle-awen/p/10023133.html
Copyright © 2020-2023  润新知