Skip to content

Some Unix Commands

Ben Chen edited this page Jul 24, 2017 · 6 revisions

Table of Contents

Some Unix Commands

References

鳥哥的 Linux 私房菜 -- 第十章、認識與學習BASH

extra notes

file 参数用 - 表示使用标准输入/输出

获取命令

cut

行内切割

cut -d '分隔符' -f fields
#fields: 第几个(eg. 1  1,3  12-)
cut -c 字符区间
#取出列区间内容

grep

搜索取出行

grep [-acinv] [--color=auto] '搜索串' filename
-a: treat binary as text
-c: 计算次数
-i: 忽略大小写
-n: 带行号输出
-v: 反向选择
--color=auto: 关键字加颜色

高级选项:
-A: after, 匹配行后续n行也输出
-B: before, 匹配行前面n行也输出
eg. 
cat xxx | grep -A3 -B2 'abc'

排序

sort

排序

sort [-fbMnrtuk] [file or stdin]
-f: 忽略大小写
-b: 忽略行首空格
-M: 月份名字排序(eg. JAN, DEC)
-n: 数字排序(整个数从小到大)
-r: 反向排序
-u: 除去重复 (uniq)
-t: 分隔符(默认为tab)
-k: 排序序号区间(与-t配合使用)
eg.
sort -t ':' -k 3 #按照以‘:’分割的第三列及其后排序
sort -t ':' -k 3,3 #按照以‘:’分割的第三列排序

uniq

除重(只处理相邻的行,所以要先排好序)

uniq [-ic]
-i: 忽略大小写
-c: 计数

wc

统计行、字数(单词数)、字符数

wc [-lwm]
-l: 行数
-w: 字数(单词数,words)
-m: 字符数

双重重定向

tee

除输出到屏幕外,多输出一份到文件里

tee [-a] file
-a: append

usage: last | tee last.list

stdin ➡️ tee ➡️ stdout
          ⬇️
         file

字符转换

tr

删除/替换

tr [-ds] SET1 ...
-d: 删除 SET1 匹配的内容
-s: 替换重复字符 SET1 为单个 SET2

col, expand

tab 换成空格

col [-xb]
-x: tab 换成空格(一般8个)
expand [t] file
-t: 每个 tab 换成多少空格

(unexpand: 把空格换成 tab)

拼接和分割

join

按分隔符分隔,对比指定的栏,两个文件相同的就连成一行(用于对比的栏会移到第一栏)(要先排序)

join [-ti12] file1 file2
-t: 分隔符(默认空格)
-i: 忽略大小写
-1: 用第一个文件的哪一栏来对比
-2: 用第二个文件的哪一栏来对比

paste

直接每行拼起来,默认用tab分隔

paste [-d] file1 file2
-d: 分隔符

split

把大文件分割成小文件(按大小或行数)

split [-bl] file PREFIX
-b: 按文件大小分割
-l: 按行数分割
PREFIX: 分割后文件名的前导字符

(合并档案:cat PREFIX* >> PREFIXwhole)

参数生成

xargs

从标准输入产生命令的参数来调用命令

(很多指令其實並不支援管線命令,因此我們可以透過 xargs 來提供該指令引用 standard input 之用!)

xargs [-0epn] command
-0: 还原特殊字符(如`,\,空格等)
-e: EOF,当遇到这个字符串时停止
-p: prompt
-n: 每次传参数的个数(按照这个参数数量多次调用命令)

格式化打印

printf

格式化输出文件内容

printf '格式' 内容
格式特殊样式:
  \a 警告声
  \b backspace
  \f 清屏(form feed)
  \n 换行
  \r 回车
  \t 水平tab
  \v 垂直tab
  \xNN 其中NN为数字,转换数字为ASCII字符
C语言中常见变量格式:
  %ns 其中n为数字,s代表string,即多少字符
  %ni 其中n为数字,i代表integer,即多少个整数位
  %N.nf 其中N、n都是数字,分别表示总位数(含小数点)和小数点后位数,f代表float
  
eg.
printf '%10s %5i %5i %5i %8.2f \n' $(cat printf.txt | grep -v Name)

文本处理

正则表达式

基本部分:

  • []: 匹配一个字符
  • [^]: 反向匹配一个字符
  • []中的-: 匹配字符范围
  • ^: 行首匹配
  • $: 行末匹配
  • .: 匹配一个任意字符(除换行符外)
  • *: 前一个字符出现零次或以上 如:o* 表示空或一个以上o
  • {}: 匹配连续个字符(需转义,即\{\}如:go\{2,\}g 表示两个g之间有至少2个o

扩展部分(除()外在sed中都需要转义,在egrep中不需要。则如果要grep该字符本身就用[+?]的形式,sed匹配该字符本身就直接用字符本身):

  • +: 前一个字符出现一次或以上
  • ?: 前一个字符出现零次或一次
  • <``>: 词首定位、词尾定位
  • |: 或操作
  • (): 群组串

例子:

  • ^$: 空白行
  • [0-9][0-9]*: 任意数字串

sed

替换、删除、添加、获取特定行内容

sed [-nefr] [动作]
-n: 安静模式,不输出输入的内容
-e: 命令行模式,将模式空间替代后的行当作命令执行
-f: 执行文件内的sed动作
-r: 使用扩展型正则表达式(默认基础)
-i: 直接修改文件内容而非输出

动作:[n1[,n2]]function
n1,n2: (可选)操作行号范围($表示最后一行)
行号可以是/RegEX/,表示匹配行
n1,+n2 表示从n1起的n2行
n1~n2 表示从n1行起每隔n2行

function:
a: 添加,后接字符串,在新一行(下一行)添加
i: 插入,后接字符串,在新一行(上一行)添加
c: 整行替换,后接字符串,替换n1,n2行号范围的内容
s: 替换(如 1,20s/old/new/g)
d: 删除
p: 输出特定行号范围内容,通常与-n配合使用


多行用反斜线然后换行来实现

awk

按栏位处理的脚本语言 这里的“栏”,也叫域(field)

awk '模式1{动作1} 模式2{动作2} ...' filename

变量:

  • $0: 整行; $1: 第一栏; $2: 第二栏; ……
  • NF: 每行栏数
  • NR: 当前行号
  • FS: 当前分隔符

动作:

  • print: ,表示输出栏位分隔符(OFS),如{print $2,$4}
  • printf: 类似C语言格式化输出

处理流程:读入每行,根据模式(条件)判断是否执行相应动作,循环。

  • BEGIN 在处理第一行前执行(可用于修改分隔符、初始化变量等)
  • END 处理完最后一行后执行

{}内分割命令用Enter;

Clone this wiki locally