Linux & Unix
这门课主要是教操作系统的一些操作指令如Regx, Shell, Python, Git,中等难度并且Double Pass。我认为这门挺有用的,对编程和写的coding的技能提升很大。这门课基本都是Andrew教的,挂科率挺高的说实话。 24T2我也挂了由于Final没过,今年继续努力了。
This course mainly covers some fundamental operating system tools and commands, such as Regex, Shell, Python, and Git. Moderately difficult & Double Pass, but I think it was useful, especially for improvin programming and coding skills. Most of the course is taught by Andrew, and to be honest, the fail rate is pretty high. I failed in 24T2 because I didn’t pass the final exam — but I’m giving it another shot this year and working harder!
Filters 过滤器
标准输出基本就是命令+上文件 得到一个输出,下面基本就是各种的的命令了。
< 左箭头代表标准输入 standard input(stdin) > 右箭头代表标准输出 standard output(stdout)
# read from the file data1
$ filter data1
# or
$ filter < data1
# read from the files data1 data2 data3
$ filter data1 data2 data3
# read from data1, then stdin, then data2
$ filter data1 - data2Regular Expression 正则表达式Regex
Shell中正则表达式可以进行模式匹配和文本处理,Python中也可以处理
字符匹配:
- . : 匹配任意单个字符串
- [abc]: 匹配字符集里面的任意一个字符串,匹配‘a’ ‘b’ 或者 ‘c’ ==
[^X]*X匹配的是“直到第一个 X(包括它)为止的所有字符” 如abcXdXefX会匹配出abcX== - [^abc]: 匹配除了字符集中的任意字符意外的字符。^在[]里面表示非,表示除(abc)之外的在开头表示,以什么为开头
- [a-z]: 匹配任意小写字母。^[abc] matches a or b or c at the start of a string.
- [A-Z]: 匹配任意大写字母。 [aeiouAEIOU] matches any (English) vowel.
- [0-9]: 匹配任务数字。
重复匹配:
- *:匹配前一个元素零次或者多次。 b* matches the empty string and: b, bb, bbb, bbbb…
- +: 匹配前一个元素一次或者多次。
- ?: 匹配前一个元素零次或者一次。
- {n}: 匹配前一个元素正好n次。
- {n,}: 匹配前一个元素至少n次。
- {n,m}: 匹配前一个元素至少n次,最多m次。
常见元字符:
- \w: 匹配任意字母、数字或下划线。 等价于:[a-zA-Z0-9]
- \d: 匹配任意数字,不包含小数,如果匹配小数话用\
d+(\.d+)* - \s: 匹配任意空白字符(空格, \t \r \n)
- \b: 匹配单词边界。
特殊字符:
- \: 转义字符,用于消除紧跟着特殊字符。如\
..原本匹配任意单个字符串的,但是前面加了\ 就只是匹配.dot点字符了。 - ^: 匹配行开始的位置。 (括号内^ 表示取反)
- $: 匹配行结束的位置。 ^cat.*dog$ matches any string starting cat and finishing dog.
- (): 分组匹配,用于捕获匹配的子字字符串。 c(,c) matches: c; c,c; c,c,c; c,c,c,c… (d|e)(f|g) matches f, g, df, dg, ef, eg, ddf, deg, edf, edg, eef, …
- |: 逻辑或操作符,匹配两个模式中的任意一个,表示or。如 perl|python|ruby matches any of: perl, python or ruby
常见的一些regex:
^ 和 $:整行匹配 ^…$ 如比^hello$ 会完整匹配整行内容为 “hello” 的行。不能多也不能少。
-x:整行匹配(等价于 ^...$)grep -xE ‘hello’ 跟 grep -E ‘^hello$’ 一样
Cat 命令
cat 是Linux和Unix系统中⽤于查看、连接和操作⽂件内容的常⽤命令。它的名称来源于 (连接) ,但它的功能不仅限于连接⽂件 cat command copies its input to output unchanged (identity filter).
基本用法
- 显示文件内容
# 该命令将显示 file1.txt ⽂件的内容。
! cat file1.txt- 连接多个⽂件并显示
# 依次显示 file1.txt 和 file2.txt 的内容,效果等同于将两个⽂件的内容连接起来。
! cat file1.txt file2.txt- 将多个⽂件连接并输出到⼀个新⽂件
# 将 file1.txt 和 file2.txt 的内容连接起来,并将结果写⼊newfile.txt。
# 如果 newfile.txt 已存在,它会被覆盖。
! cat file1.txt file2.txt > newfile.txt- 追加内容到已有⽂件 两个>>
# 将file1.txt的内容追加到existingfile.txt的末尾。
! cat file1.txt >> existingfile.txt常见参数
- -n Number output lines (starting from 1) 显示⾏号
# 该命令在显示 file1.txt 内容时,会为每⼀⾏加上⾏号。
! cat -n file1.txt- -s Squeeze consecutive blank lines into single blank line 压缩多个空⾏
# 该命令将多个连续的空⾏压缩为⼀个空⾏ 。
! cat -s file1.txt- -v –show-nonprinting 显示非打印字符(如控制字符除了换行符和制表符)
- -A Display non-printing characters – handy for debugging(not available on Mac) 显示非打印字符
-v 和 -A 基本作用是一样的,只是有细微的区别 -A相当于-vET -E显示行尾(\n)为 $ -T: 显示 Tab 为^I
| 选项 | 展示内容 | Tab (\t) | 换行 (\n) | 控制字符 | 说明 |
|---|---|---|---|---|---|
-v | 非打印字符 | 正常显示 | 正常显示 | ^ 形式 | 适合看控制字符 |
-A | -vET 组合(全面显示) | ^I | $ 结尾 | ^ 形式 | 最详细的可视化 |
# 假设有一个文件 file.txt 内容如下:
Hello^M
World<TAB>
cat -v file.txt
# 输出
# Hello^M
# World<TAB>
# ====================
cat -A file.txt
# 输出
# Hello^M$
# World^I$grep 命令
一个强大命令行工具,经常能用作⽂件或⽂本中搜索匹配特定模式的⾏,也可以使⽤正则表达式来匹配复杂的模式。 Final 必考
基本用法
- 在⽂件中搜索特定模式 grep 后面紧跟想要搜索的内容
# 在 file1.txt ⽂ 件中搜索包含 "pattern"的⾏ ,并将这些⾏打印出来。
! grep "pattern" file1.txt- 在多个⽂件中搜索特定模式
# 在 file1.txt 和 file2.txt 中搜索包含 "pattern" 的 ⾏ ,并将这些⾏打印出来。
! grep "pattern" file1.txt file2.txt常见参数
- -i 忽略⼤⼩写搜索
# 忽略⼤⼩写,在 file1.txt ⽂ 件中搜索 "pattern" "PATTERN"也会被认为符合
! grep -i "pattern" file1.txt- -n 显示行号
# 在输出的每⼀⾏前加上⾏号,显示包含 "pattern" 的⾏及其⾏号。
! grep -n "pattern" file1.txt- -v 反选,显示不匹配的⾏
# 反向查找: 某⼀个⾏不包含 pattern
! grep -v "pattern" file1.txt- -o仅输出与模式匹配的部分,⽽不是整个包含匹配的⾏
# 输出对应的匹配
! grep -o "pattern" file1.txt
# 带有正则表达式
! grep -o "pattern .*" file1.txt
! echo "afafafaf123xyz" | grep -o '[0-9]*'
# 123
! echo "afafafaf123xyz" | grep -o '[a-z]*'
# afafafafxyz- -E 使⽤正则表达式来找匹配的内容
! grep -E "pattern .*" file1.txt
# 搜索包含字符串“foo” or “bar”的行
grep -E 'foo|bar' filename
# 搜索包含“foo” 后面跟一个或者多个“bar”的行
grep -E 'foo(bar)+' filename
# 搜索以“foo” 或“bar”开头的行
grep -E '^(foo|bar)' filename# 只打印出有hello字符的行
! cat file1.txt | grep "hello"- -c 打印匹配的行数print a count of matching lines
# 输出包含hello的行数
! grep -c "hello" file1.txt- -w 匹配完整的单词行 only match if the pattern forms a complete word
# example.txt 内容是:
cat
cater
concatenate
dog cat dog
catalog
grep -w "cat" example.txt
# 输出
# cat
# dog cat dog
# 不匹配cater、catalog、concatenate 因为这些都包含 cat,但不是“独立成词”。- -x 整行完全匹配 only match if the entire line exactly matches the pattern
# example.txt 内容是:
cat
cat dog
a cat
the cat
grep -x "cat" example.txt
# 输出 cat
# 不匹配 cat dog、a cat、the cat 因为整行内容并不正好是 cat。wc 命令
wc (word count) 命令是⼀个⽤于统计⽂件中的字节数、字数、⾏数等信息的命令。它常⽤于⽂ 本处理和⽂件分析 Final 也常考
基本用法
就是 wc + [option] + filename 如果有多个文件也可以 wc filename1 filename2
常见参数
- -l 选项⽤于统计⽂件中的⾏数 -l line
# 统计⽂件中的⾏数
! wc -l file1.txt- -w 选项⽤于统计⽂件中的字数(以空格、制表符、换⾏符作为分隔符) -w word
# 统计⽂件中的字数(以空格、制表符、换⾏符作为分隔符)
! wc -w file1.txt- -m 选项⽤于统计⽂件中的字符数
# 统计⽂件中的字符数
! wc -m file1.txt- -c 选项⽤于统计⽂件中的字节数 -c characters
# 统计⽂件中的字节数
! wc -c file1.txt
! echo "abc" | wc -c
# 输出4 因为实际"abc" 是“abc\n” 有一个换行符 换行符也被算进去了- 不带任何选项 wc 将输出三个数值
# 分别输出行数、字数、字节数, -n -w -c
! wc filenametr命令
tr 命令是⼀个⽤于转换或删除字符的命令⾏⼯具,通常⽤于处理⽂本⽂件。它可以执⾏字符的替换、压缩和删除操作。 简答的替换 sed命令更强大一点
基本用法
tr [option] SET1 [SET2]
常见参数
- 字符替换
# 将⼩写字⺟转换为⼤写字⺟
! echo "hello world" | tr 'a-z' 'A-Z'- -d 删除字符
# 删除所有⼩写字⺟
! echo "hello world 123" | tr -d 'a-z'
! echo "hello world 123" | sed 's/[a-z]//g'
# 删除空格
! echo "hello world 123" | tr -d ' '- -s 压缩重复字符 去除重复的
# 将连续的空格压缩为⼀个空格
! echo "hello world" | tr -s ' '- -c 表示反选 map all bytes not occurring in 𝑠𝑜𝑢𝑟𝑐𝑒𝐶ℎ𝑎𝑟𝑠 (complement)
# 反选-c 'a-z' 表示⾮ a-z 的替换成空格
! echo "hello 123, world" | tr -c 'a-z' ' '
# 反选 -c 'a-z' 表示⾮a-z都被删除
! echo "hello 123, world" | tr -cd 'a-z'- tr ⽀持字符类,如 转换为⼤写字⺟[:lower:]、 [:upper:]、 [:digit:] 等。
# 将所有⼩写字⺟转换为大写
! echo "hello world" | tr '[:lower:]' '[:upper:]'
# 删除所有⾮字⺟字符,并压缩连续的空格:
! echo "hello world 123 !!! " | tr -d -c '[:alpha:] ' | tr -s ' '
# 或者写成
! echo "hello world 123 !!! " | tr -cd '[:alpha:] ' | tr -s ' 'head / tail 命令
head / tail分别是查看文件的前几行和后末尾几行的 默认10行
基本用法
head -n 10 file (prints last 10 lines of file).
常见的参数就是 -n
# 会打印第81...100行的文件
! cat filename | head -n 100 | tail -n 20 cut命令
cut命令是⼀个⽤于从⽂件或标准输⼊中提取⽂本⽚段的命令⾏⼯具。它可以按列、字符或字段 分隔符提取特定部分的内容
基本用法:
cut [option] [filename]
常见参数
- -c character 选项用于按字符位置提取内容
# 提取第 1个和第 3个字符
! echo "abcdef" | cut -c 1,3
# 提取第 2到第 4个字符
! echo "abcdef" | cut -c 2-4- -f ⽤于按字段提取内容,通常与 -d搭配来使用
# 提取第 2到第 4个字段,假设字段用制表符分隔
! echo -e "a\tb\tc\td\te" | cut -f 2-4 # b c d- -b 用于按字节位置提取内容
# 提取第1到第4个字节
! echo "abcdef" | cut -b 1-4 #abcd- -d 以什么为分隔符提取字段
# 以 ‘ ’ 作为分隔符,就是以空格的分段的
! echo "a b c d e f" | cut -d ' ' -f-4 #a b c d- 常见操作
# 假设data 内容是空格或者 | 分隔
# print the first column 第一列
cut -f1 data
# print the first three columns 前三列
cut -f1-3 data
# print the first and fourth columns 第一列 和 第四列
cut -f1,4 data
# print all columns after the third 三列后面的全部
cut -f4- data
# print the first three columns, if '|'-separated -d 以|为分隔符 输出前三列
cut -d'|' -f-3 data
# print the first five chars on each line 输出一行的前5的字符串
cut -c1-5 datasort命令
sort 命令是⼀个⽤于对⽂件内容进⾏排序的命令⾏⼯具,可以按⾏对⽂本⽂件的内容进⾏升序 或降序排序。它⾮常适合处理和分析⼤型⽂本⽂件。
基本用法
sort [option] [filename]
常见参数
- 默认排序,默认是升序
# sort 命令默认按字典顺序(按 ASCII 码值)对每⾏进⾏排序。
! sort sorted_01.txt- -d 按照字典排序 ignore non-letters and non-digits
! sort -d sorted_01.txt
# 如果有一个data数组里面是字符串
# [a10, a2, b1, b10, a1] 排序后是 [a1, a2, a10, b1, b10]
# [10, 2, 33, 21, 100] 排序后是[10, 100, 2, 21, 33]- -n 按数字排序
# 使⽤ -n 选项按数字排序,⽽不是按字典顺序。
! sort -n sorted_01.txt- -r 按逆序排序
# 使⽤ -r 按逆序排序(降序) 。
! sort -r sorted_01.txt
# 使⽤ -nr 按数字逆序排序(降序) 。
! sort -nr sorted_01.txt- -k 按指定字段排序 (第几列排序)
# 使⽤ -k 选项指定按哪个字段(那一列)进⾏排序,字段从1(第一列)开始计数。
# 字段之间默认 ⽤空⽩字符分隔
sort -k N filename.txt- -t 指定分隔符排序
# 以|分隔数据,再根据第几列开始排序
sort -t '|' -k N filename.txt
# 按 ⽤ |分隔的第⼆个字段排序。
# 按照 zid 来排序
! sort -t '|' -k 2 enrollments.txt
# 也可以这样写
! sort -t| -k 2 enrollments.txt- 其他例子
# sort numbers in 3rd column in descending order 第三列逆序排序
sort -nr -k3 data
# sort the password file based on user name 以:分隔对第5列进行排序
sort -t: -k5 /etc/passwd
# -k7 首先按第 7 个字段排序 -k1 如果第 7 字段相同,按第 1 个字段排序 -k2 如果第 1 字段也相同,再按第 2 个字段排序
sort -t'|' -k7 -k1 -k2
# -k6.5:表示从 第 6 字段的第 5 个字符开始排序 如果第 6 字段的排序值相同,就按第 2 字段升序,再按第 1 字段升序。
sort -t'|' -k 6.5nr -k2 -k1 filenameuniq命令
uniq命令是⼀个⽤于报告或忽略⽂件中重复⾏的命令⾏⼯具。它通常与sort 命令⼀起使⽤只能识别相邻的重复⾏,通常是去重,用于过滤或文件标准输入的重复行,final常考
基本用法
uniq [option] [inputFilename] [outputFilename]
常见参数
- 默认情况下, 只删除相邻的重复⾏。
# 只删除相邻的重复⾏
! echo "1\n1\n2\n3\n2\n2\n2\n1" | uniq
# 输出
# 1
# 2
# 3
# 2
# 1- -d only print (one copy of) duplicated lines 显示重复⾏ duplicated
! echo "1\n1\n2\n3\n2\n2\n2\n1" | uniq -d
# 输出
# 1
# 2- -u only print lines that occur uniquely (once only) 仅显示⾮重复的⾏。
! echo "1\n1\n2\n3\n2\n2\n2\n1" | uniq -u
# 输出
# 2
# 3
# 1- -c also print number of times each line is duplicated 显示重复的次数(在每行开头显示)
# 正常直接使用 uniq -c 是先只删除相邻的重复⾏,再在前面显示重复的次数(在每行开头显示)
! echo "1\n1\n2\n3\n2\n2\n2\n1" | uniq -c
# 输出
# 2 1
# 1 2
# 1 3
# 3 2
# 1 1
# extract first field, sort, and tally
# 提取第一列排序然后统计出现的次数(在每行开头)
cut -f1 data | sort | uniq -c- -i 忽略大小写
! uniq -i uniq_01.txt- 其他例子
# 与sort命令相结合 先sort再去重 就是让对文件内容排序(相同的行会聚在一起)利用了uniq只会对相邻的行去重的特性。这里是对第二列内容排序然后去重
! cut -d '|' -f2 enrollments.txt | sort | uniq
#这里是只输出有三次的重复的行
! sort uniq_01.txt | uniq -c | grep -E '\s*3 '
# sort uniq_01.txt 对文件内容排序(相同的行会聚在一起)
# | uniq -c 统计每一行出现的次数,前缀是次数
# | grep -E '\s*3 ' 只保留前缀次数是 3 的行
# '\s*3 ' 有0个或多个空格然后跟数字3最后跟一个空格sed命令
sed 是⼀个⽤于对⽂本进⾏解析和转换的强⼤命令⾏⼯具。它可以执⾏基本的⽂本替换、⽂本删除、⽂本插⼊、⽂本查找等操作。 一大难点,Final必考,知识点也很多,很难全部记住,Final记住常用的命令就好了
基本用法
sed [option] ‘script’ filename script 是你希望 sed 执⾏的命令 filename 是你希望处理的⽂件
常见参数
- 默认情况下是替换操作 sed ‘s/pattern/replacement/’ filename (只要满⾜ s[符号]old[符号]new[符号] 的形式,都是可以替换的)
# 使⽤符号是 / 不加g的话就是只替换一次
! echo "abcaa" | sed 's/a/1/' # 输出1bc/aa 只替换一次
# 使⽤符号是 :
! echo "abc/aa" | sed 's:a:1:' # 输出1bc/aa 只替换一次
# 使用g 就是全局替换
! echo "abc/aa" | sed 's/a/1/g' # 输出1bc/11
! echo "abcaa" | sed 's:a:1:g' # 输出1bc/11- -i 选项可以直接编辑和修改⽂件内容,但是会直接修改原来的文件(小心使用)
# 将file.txt ⽂件old单词替换成new
# 注意:这会直接修改 file.txt ⽂件(直接修改内容,而不是输出到标准输出)
sed -i 's/old/new/g' file.txt- ‘d’ 用于删除第几行 这里的用法不是 -d 而是 ‘d’
# 删除⽂件中的第 2⾏
! sed '2d' file1.txt
# 删除匹配特定模式的⾏ 将其他打印出来
! sed '/pattern/d' file.txt
# print only lines Not containging 'xyz'
! echo "hello yafei\nbcxyzm\nxycz\nxyz" | sed '/xyz/d' #\n是换行符
# 输出
# hello yafei
# xycz
# 删除文件的空白行
! sed '/^$/d' filename- ‘p’ ⽤于打印匹配的⾏。结合 -n可以只打印匹配的⾏.
# 只打印第⼆⾏
! sed '2p' file3.txt
# 或者配合-n 只打印第⼆⾏
! sed -n '2p' file3.txt
# 如果匹配 /0$/(即以 0 结尾),就额外打印一次(p 是 print)
! echo "130\nhello\nscore:90\n11\n10\n11" | sed '/0$/p'
# 会输出130
# 130
# hello
# score:90
# score:90
# 11
# 10
# 10
# 11
# 加上-n禁用默认输出,然后就只会打印匹配的
! echo "130\nhello\nscore:90\n11\n10\n11" | sed -n '/0$/p'
# 130
# score:90
# 10- -n 使用n选项后,只用sed特殊处理的行才会输出
# print all lines
sed -n 'p' filename
# print the first 10 lines
sed '10q'filename
sed -n '1,10p' filename
# print lines 81 to 100
sed -n '81,100p' filename
# 会打印从 root 开头那一行开始打印,一直到(并包含) nobody 开头的那一行。
# /pattern1/,/pattern2/ 表示:从第一次匹配到 pattern1 的行开始,到第一次匹配到 pattern2 的行结束(包含两端)。
sed -n '/^root/,/^nobody/p' /etc/passwd- -e 使用这个选项执⾏多个 sed 命令 能允许应用多个编辑命令 -E是启用 扩展正则(ERE),使得
()表示捕获组,?+*{}等无需转义
# 这里是直接修改文件内容没有输出(将old变成new 并且删除第2行) 加上‘p’才会输出
! sed -e 's/old/new/' -e '2d' file.txt
# ([^:]*):([^:]*):(.*)$ 第 1 个字段(不是冒号的字符) 第 2 个字段 然后剩下的所有内容(包括其他冒号)
# \2:\1:\3 表示把第 1、2 字段的顺序颠倒,保留后续字段。
sed -E 's/([^:]*):([^:]*):(.*)$/\2:\1:\3/'
# 如:alice:1000:/home/alice:/bin/bash
# 分配后是\1 = alice \2 = 1000 \3 = /home/alice:/bin/bash
# 输出后的结果是 1000:alice:/home/alice:/bin/bash- -q 表示退出,在匹配成功并执行后,立即退出 sed 处理流程,而不是继续处理后面的行。
# data.txt:
apple
banana
cherry
date
elderberry
# -n:禁止默认输出 /r/:匹配包含字符 r 的行 {p;q}:在第一次匹配到的行:p打印它 q立即退出
sed -n -e '/r/{p;q}' data.txt
# 输出 cherry
# 读取 file 的前 2 行,并立即退出,不再处理第 3 行及之后的内容
sed '3q' data.txt
# 输出 apple banana- 范围操作
# 删除2到4行内容
! sed '2,4d' file3.txt
# 删除匹配 /1./ 和匹配到的 /2./ 之间的所有行(包括这两行本身)
! sed '/1./,/2./d' file3.txt- 删除特定行
# 替换特定 ⾏ (如第 3⾏ )的内容为 "new content":
# 3 表示只对第3行应用后面的替换命令
! sed '3s/.*/new content/' file3.txt- 其他例子
# 删除文件的中的空白行
sed '/^$/d' filename
# 在文件中每行前添加行号
# sed = filename 给文件的每一行前面加上行号,并在行号和原文本之间插入一个换行符 \n。
# sed 'N;s/\n/\t/' N: 把当前行和下一行合并为一行,用 \n 连接 s/\n/\t/:把中间的 \n 替换为制表符 \t。
sed = filename | sed 'N;s/\n/\t/'
# file:
# apple
# banana
# cherry
sed = filename
# 1
# apple
# 2
# banana
# 3
# cherry
sed 'N;s/\n/\t/' # 先将 1 和 apple 变成了 1\tapple
# 1 apple
# 2 banana
# 3 cherryjoin命令
Linux join命令用于将两个文件中,指定栏位内容相同的行连接起来。 找出两个文件中,指定栏位内容相同的行,并加以合并,再输出到标准输出设备。
基本用法
join [-i][-a<1或2>][-e<字符串>][-o<格式>][-t<字符>][-v<1或2>][-1<栏位>][-2<栏位>][–help][–version][文件1][文件2]
命令比较多 理解为主吧,Final一般是考察Python中的join()
常见参数
- -a<1或2> 除了显示原来的输出内容之外,还显示指令文件中没有相同栏位的行。
- -e<字符串> 若[文件1]与[文件2]中找不到指定的栏位,则在输出中填入选项中的字符串。
- -i或–igore-case 比较栏位内容时,忽略大小写的差异。
- -o<格式> 按照指定的格式来显示结果。
- -t<字符> 使用栏位的分隔字符。
- -v<1或2> 跟-a相同,但是只显示文件中没有相同栏位的行。
- -1<栏位> 连接[文件1]指定的栏位。
- -2<栏位> 连接[文件2]指定的栏位。
- –help 显示帮助。
- –version 显示版本信息。
例子
$ cat testfile_1 #testfile_1文件中的内容
Hello 95 #例如,本例中第一列为姓名,第二列为数额
Linux 85
test 30
cmd@hdd-desktop:~$ cat testfile_2 #testfile_2文件中的内容
Hello 2005 #例如,本例中第一列为姓名,第二列为年份
Linux 2009
test 2006
$ join testfile_1 testfile_2 #连接testfile_1、testfile_2中的内容
Hello 95 2005 #连接后显示的内容
Linux 85 2009
test 30 2006
$ cat data1
Bugs Bunny 1953
Daffy Duck 1948
Donald Duck 1939
Goofy 1952
Mickey Mouse 1937
Nemo 2003
Road Runner 1949
$ cat data2
Warners Bugs Bunny
Warners Daffy Duck
Disney Goofy
Disney Mickey Mouse
Pixar Nemo
$ join -t' ' -2 2 -a 1 data1 data2 # 输出的内容
Bugs Bunny 1953 Warners
Daffy Duck 1948 Warners
Donald Duck 1939
Goofy 1952 Disney
Mickey Mouse 1937 Disney
Nemo 2003 Pixar
Road Runner 1949find命令
Linux find 命令用于在指定目录下查找文件和目录。 它可以使用不同的选项来过滤和限制查找的结果。
基本用法
find [路径] [匹配条件] [动作]
常见参数
路径 是要查找的目录路径,可以是一个目录或文件名,也可以是多个路径,多个路径之间用空格分隔,如果未指定路径,则默认为当前目录。
-name pattern:按文件名查找,支持使用通配符*和?。-type type:按文件类型查找,可以是f(普通文件)、d(目录)、l(符号链接)等。-size [+-]size[cwbkMG]:按文件大小查找,支持使用+或-表示大于或小于指定大小,单位可以是c(字节)、w(字数)、b(块数)、k(KB)、M(MB)或G(GB)。-mtime days:按修改时间查找,支持使用+或-表示在指定天数前或后,days 是一个整数表示天数。-user username:按文件所有者查找。-group groupname:按文件所属组查找。
动作: 可选的,用于对匹配到的文件执行操作,比如删除、复制等。
-amin n:查找在 n 分钟内被访问过的文件。-atime n:查找在 n*24 小时内被访问过的文件。-cmin n:查找在 n 分钟内状态发生变化的文件(例如权限)。-ctime n:查找在 n*24 小时内状态发生变化的文件(例如权限)。-mmin n:查找在 n 分钟内被修改过的文件。-mtime n:查找在 n*24 小时内被修改过的文件。
# find all the HTML files below /home/z5234567/public_html
find /home/z5234567/public_html -name '*.html'
# find all your files/dirs changed in the last 2 days
find ~ -mtime -2
# show info on files changed in the last 2 days
find ~ -mtime -2 -type f -exec ls -l {} \;
# show info on directories changed in the last week
find ~ -mtime -7 -type d -exec ls -ld {} \;
#find directories either new or '07' in their name
find ~ -type d \( -name '*07*' -o -mtime -1 \)cp命令
⽤于复制⽂件和⽬录。它可以将⼀个或多个源⽂件或⽬录复制到目标文件或者目录.
基本用法
cp [option] 源文件 目标文件/目标目录
# 复制单个 ⽂ 件
! cp file1.txt file2.txt
# 递归复制 ⽬ 录
! cp -r /home/user/source_directory /home/user/target_directorymv命令
⽤于移动⽂件和⽬录的命令,它还可以⽤于重命名⽂件和⽬录.
基本用法
mv [option] 源文件 目标文件/目标目录
# 移动⽂件
! mv file1.txt /home/user/target_directory/
# 重命名⽂件
! mv oldname.txt newname.txt
# 移动多个 ⽂ 件到 ⽬ 录
mv file1.txt file2.txt /home/user/target_directory/diff命令
⽤于⽐较⽂件或⽬录的内容,显示它们之间的差异
基本用法
diff [option] file1 file2
%%bash
diff [选项] ⽂件1 ⽂件2
if diff -q diff_1.txt diff_2.txt > /dev/null; then
echo "⽂件相同"
else
echo "⽂件不同"
fidirname/basename命令
dirname 命令⽤于从给定的⽂件路径中提取⽬录路径部分 basename命令⽤于从给定的⽂件路径中提取⽂件名部分,或者从⽂件路径中删除指定的后缀并返回⽂件名。
基本用法
diff [option] file1 file2
# 获取⽂件夹路径
! dirname /usr/local/bin/script.sh
# 获取⽂件名字
! basename /usr/local/bin/script.sh
# 获取⽂件名字 , 去掉后缀
! basename /usr/local/bin/script.sh .sh
发表回复
要发表评论,您必须先登录。