美文网首页
[055]linux一些基本命令-sed,$()

[055]linux一些基本命令-sed,$()

作者: shawnxjf | 来源:发表于2017-07-13 23:39 被阅读0次

    背景

    晚上帮一个朋友解决shell脚本的命令,好久没有用shell脚本有点生疏。
    所以我也跟着回顾了一些shell知识。

    sed

    sed 是一个流编辑器而不是一个替换的工具(我们 用得最多的就是其替换功能)。他的原理是读取文件中的行存放到缓冲区,接着用sed处理缓冲区的内容,处理完成后把结果送到屏幕,所以文件内容并没有变。

    sed 主要用来编辑多个文件简化文件的反复操作用来转换程序。

    shawndeMacBook-Pro:~ shawn$ cat seddemo.txt 
    I have a lot of books
    shawndeMacBook-Pro:~ shawn$ sed 's/book/books/'  seddemo.txt
    I have a lot of bookss
    shawndeMacBook-Pro:~ shawn$ cat seddemo.txt  //原有的文件没有被替换
    I have a lot of books
    shawndeMacBook-Pro:~ shawn$ 
    

    sed命令具体参考:http://man.linuxde.net/sed
    sed主要用于对于缓冲中的数据进行,处理比如del、replace等等,还可以使用正则表达式。

    awk

    awk是一门编程语句,可以定义变量、数组、有运算符、有控制语句比如for循环等。

    awk工作原理参考:
    http://man.linuxde.net/awk#awk的工作原理,具体步骤是
    1).定义头部BEGIN{}
    2).pattern,读取文件每一行,进行转换输出。//注意在pattern中才开始遍历循环
    3).end{}输出尾部。
    由于头部,pattern,尾部经常用于输出类似表格的格式化数据。

    cat    test.csv  | awk -F"," '{print $2,$3}'    ----------------我习惯与用管道如此写:
    //$n 当前记录的第n个字段,比如n为1表示第一个字段,n为2表示第二个字段。 $0 //这个变量包含执行过程中当前行的文本内容。
    

    定义变量

    redo=1
    data_root_dir="$HOME/data/VOCdevkit"
    1.等号两遍不要有空格
    2.引用一个变量需要带$符号,比如
    一般情况下,$var 与 ${var} 并没有啥不一样。
    但是用 ${ } 会比较精确的界定变量名称的范围,比方说:

    $ A=B
    $ echo $AB
    

    原本是打算先将 $A 的结果替换出来,然后再补一个 B 字母于其后,
    但在命令行上,真正的结果却是只会替换变量名称为 AB 的值出来…
    若使用 ${ } 就没问题了:
    3.定义数字不带“”,定义字符串要带“”号。

    if语法

    if [ $redo ]
    then
      extra_cmd="$extra_cmd --redo"
    fi
    

    for 命令语法

    for subset in test trainval
    do
      ...
    done
    

    dirname

    截图路径的目录部分

    dirname
    shawndeMacBook-Pro:~ shawn$ dirname /usr/bin/sort 
    /usr/bin
    

    变量替换

    $( ) 与 (反引号) 都是用来做命令替换用(command substitution)的。
    所谓的命令替换与我们第五章学过的变量替换差不多,都是用来重组命令行:

    $ echo the last sunday is $(date -d "last sunday" +%Y-%m-%d)
    -- 结果:
    the last sunday is 2018-02-18
    
    

    如此便可方便得到上一星期天的日期了… _
    用 $( ) 的理由:
    1, 很容易与 ' ' ( 单引号)搞混乱,尤其对初学者来说。
    有时在一些奇怪的字形显示中,两种符号是一模一样的(直竖两点)。
    2, 在多层次的复合替换中, 须要额外的跳脱( ` )处理,而 $( ) 则比较直观。例如:
    这是错的:
    [code]command1 command2command3[/code]
    原本的意图是要在 command2 command3 先将 command3 提取出来给 command 2 处理。

    pwd1=$(ls ./)
    shawndeMacBook-Pro:~ shawn$ echo $(pwd1) //$()里必须是command
    -bash: pwd1: command not found
    
    shawndeMacBook-Pro:~ shawn$ echo ${pwd1}
    Applications Applications (Parallels) ...... 我的坚果云
    

    说在后面的话

    由于代码运行结果依赖输入数据且人很容易陷入扣代码的细节,所以我建议是把代码日志输出出来。根据输入和输出你能够忽略细节最快的看代码。从这一点上我们看源代码不能只看不去运行,带着疑问要跑起查看运行日志这会让我们更加快速的开源软件架构和细节。

    相关文章

      网友评论

          本文标题:[055]linux一些基本命令-sed,$()

          本文链接:https://www.haomeiwen.com/subject/nlwghxtx.html