SMPCUP2017_linux_cmd

来源:互联网 发布:数据库表主键的作用 编辑:程序博客网 时间:2024/05/16 04:25

SMPCUP2017—Linux命令


  1. 流重定向命令 >>>,前者是覆盖,后者是追加

    假如有名为helloworld.py的python script

    #!/bin/python3# -*- coding: UTF-8 -*-print('Hello,world!')

    和普通文本文件123.txt

    this is 123.txt

    在终端命令行中运行./helloworld.py ,会在终端中输出 Hello,world!
    当想要将输入写入文件时,就可以用重定向命令:

    • ./helloworld.py > 123.txt ,然后123.txt的内容变成下面这样

      Hello,world!
    • ./helloworld.py >> 123.txt 然后123.txt的内容变成

      this is 123.txtHello,world!
  2. 查找命令find

    find /home -name hello*   # 查找home目录下文件名或目录为hello的find / -name h?m*   # 查找根目录下h开头 第二个字符任意 第三个字符是m 后面是任意字符 的文件或目录find / -size +1000000k   # 查找根目录下文件容量大于1000000k的文件

    一般情况会用find查找某个文件就行,更多用法详见man find

  3. sed -n '1,100p' file1 > newfile

    输出文件file1的第1~100行,并将结果定向到文件newfile (也就将file1的1~100行提取到newfile里)

    sed的命令选项 ‘p’—打印 可以用来分隔大的文本文件。是按行分隔的。

  4. cat file1 | grep regex

    cat输出文件file1的内容,grep选取匹配正则表达式regex的所有行

    • grep -a 处理二进制文件。本次比赛选取blogs时会遇到’Binary file matches’的报错,加上-a即可解决
    • grep -n 可以列出行号
    • grep -w 精确匹配。比如我们想选取文件中开头包含数字’152’的行,如果只用grep ‘152’,就会
      把开头是11152/15277/15288等所有包含152的选出来, 改成grep -w ‘152’后,就只会选取是’152’的,
      不会出现’11152’这种的,再改成grep -w ^’152’ 就是只选去行开头是’152’的行
  5. sort file1uniq file1

    sort可以用来对文件排序。

    • sort -k 2 -t ' ' 以空格为分隔符,以第二列为基准,对文件排序
    • sort -r 默认是升序排序,加上-r选项是降序排序

    uniq用来对文件去重。

  6. awk

    cat file1 | awk '{print $2}' 输出文件file1的第二列。要求文件内容每行有相同分隔符。

    cat file1 | awk -F ' ' '{print $2}' 以空格为分隔符提取出文件的第二列。

    cat ccc.txt | awk '{for(i=1;i<=78;i++) if(条件) {printf$i" "; if(条件) printf"";}}' awk亦是一门编程语言,语法类似于C,相比于其他命令有更强大的处理能力。

  7. paste

    paste -d ' ' file1 file2 将文件file1和file2 以空格为分隔符 横向拼接起来 (’-d’选项可指定分隔符,默认是制表符)

    cat file2 >> file1 将file2的内容贴到file1后面,即实现纵向拼接。 (重定向一定要用’>>’,用’>’会覆盖了file1的内容)

  8. bash script

    bash脚本约等于一堆命令的组合+程序语句

    #!/bin/bash:<<BLOCK# 找发博客的记录FILENAME=(../../../SMPCUP2017ValidationSet/SMPCUP2017_ValidationSet_Task02_transencoding.txt)while read LINEdoif cat /mnt/windows_G/DataMining/SMPCUP2017DATACorpus/2_Post.txt | grep -a ${LINE} >> Task02_Validation_user_Post.txtthenecho "Find:"${LINE}fidone < $FILENAMEBLOCK:<<BLOCK# 提取出发的博客FILENAME=(temp2.txt)while read LINEdouid=${LINE:0:8}did=${LINE:9:8}if doc=`cat ../../../BlogContent_100k_split/Blog04.txt | grep -a $did`thenecho "Find:"${did}echo ${uid} ${doc} >> Task02_Validation_Post_blogs.txtelseecho ${LINE} >> temp3.txtfidone < ${FILENAME}BLOCK# 将每个用户各自发的博客写在一起# 这块功能理论上在上一块注释中可以直接实现FILENAME1=(../../../SMPCUP2017ValidationSet/SMPCUP2017_ValidationSet_Task02_transencoding.txt)while read LINE1dotouch ./Validation_each_user_Post_blogs/${LINE1:0:8}_post_blogs.txtdone < ${FILENAME1}FILENAME=(Task02_Validation_Post_blogs_sort.txt)while read LINEdouid=${LINE:0:8}doc=${LINE:18}echo ${doc} >> ./Validation_each_user_Post_blogs/${uid}_post_blogs.txtdone < ${FILENAME}echo $SECONDS
    • 开头的#!/bin/bash指定用哪个解释器执行脚本
    • bash中单引号中的字符串相当于python中的raw string,即所有字符都是原义,
      双引号中才可以有转义字符;单引号中不可以转义单引号
    • FILENAME存放文件名的变量,只存放一个文件名的话,用圆括号/单双引号都行
    • 对变量的赋值可以直接进行,使用变量要加’$’。比如: LINE=’U0002100’是赋值,
      想要使用变量 输出LINE, 就是echo ${LINE}
      使用变量时加上’{}’花括号是个好习惯。
      ${LINE:1:5} 表示对变量LINE,从下标1开始,取五个字符,即’00021’
    • bash中进行文件的读取,也是本次比赛中常用的操作
      bash
      # 釜底抽薪式的while读取文件
      FILENAME=()
      while read LINE # read还可以用于读取标准输入,类似python的input()
      do
      echo ${LINE} # 输出每一行
      done < ${FILENAME}
    • if statements
      bash
      if conditions
      then
      action1
      action2
      else
      action3
      fi

      bash中的if语句,else后面为空的话,就不要写else,结束用if的倒写fi。
      若conditions执行成功,则执行then后面的语句。
      每条命令执行完后都有返回码($?),可以用echo $?来查看上条命令执行后的结果,返回码为0
      则表示执行成功
      如上面大段代码块中的if cat file | grep -a regex >> file2,只有找到regex匹配的行并写入file2,这条cat语句的返回码才为0,
      如果没找到匹配的行,那返回码就不为0

    bash中if语句的条件有多种形式,和其他语言的表示不太一样,具体用时请多查看资料


©Liberty