grep命令
格式:grep 参数 匹配的表达式 文件。在文件中找出符合匹配表达式的内容
grep "line" test.txt
常用参数:
参数 | 含义 |
---|---|
-c | 只打印匹配的行数,不打印匹配的内容 |
-i | 忽略字母大小写 |
-l | 列出含有匹配表达式的文件名,不显示具体内容 |
-n | 列出所有含有匹配表达式的行,并显示行号 |
-r | 递归搜索 |
-v | 显示不包含匹配表达式的行内容 |
-E | 支持正则表达式 |
-P | 支持Perl正则表达式 |
关于shell中的正则表达式语法和Python中类似,可参考python正则表达式学习记录
echo命令
格式:echo 参数 内容 。在控制台输出内容,并自动换行。添加-n参数可以输出后不换行。
echo "Hello World"
输出命令执行结果:
echo `ls -lth`
可以通过>将结果重定向到文件中:关于>的使用可以参考shell学习笔记—基础语法
echo `ls -lth` > all.txt
支持转义字符:但需要-e参数
echo -e "hello\tworld"
转义字符 | 含义 |
---|---|
\b | 退格符 |
\c | 后续文本不输出 |
\f | 换页符 |
\n | 换行符 |
\r | 回车符 |
\t | 水平制表符 |
\r | 垂直制表符 |
fold命令
格式:fold 参数 文件。将文件内容按照指定宽度输出,超出部分转到下一行输出。
fold -w 20 test.txt
参数 | 含义 |
---|---|
-b | 按字节计算宽度,默认是字符 |
-s | 对单词不进行折断,在空格处折断 |
-w | 指定宽度,默认是80列 |
wc命令
格式:wc 参数 文件。对文件内容进行统计。不加任何参数如下面命令,默认输出三个结果,依次是行数,单词书数,字符数。
wc test.txt
参数 | 含义 |
---|---|
-c | 统计字节数 |
-m | 统计字符数 |
-l | 统计行数 |
-L | 统计最长行的长度 |
-w | 统计单词数 |
fmt命令
格式:fmt 参数 文件。将文件段落按格式输出。
fmt -w 30 test.txt
参数 | 含义 |
---|---|
-c | 保留每个段落的首行缩进 |
-s | 只折断超过指定宽度的行,不合并短的行 |
-w | 指定每行最大宽度,默认75列 |
rev反转字符输出
格式:rev 文件。将文件倒序输出。
rev test.txt
pr命令
格式:pr 参数 文件。将文件转换成适合打印的格式输出。
pr -a -4 test.txt
test.txt内容:
用上面命令打印后:
参数 | 含义 |
---|---|
-n | 指定输出的一行有n列,n换成阿拉伯数字 |
-a | 水平创建一行,不加-a默认是垂直创建一行 |
-h | 指定页眉,默认是文件名 |
-l | 每页的行数,默认66行 |
-w | 指定页面的宽度,默认72个字符 |
-t | 不显示标题 |
sort命令
格式:sort 参数 文件
文件原本内容:
用下面命令排序并打印:
sort test.txt
结果:不加任何参数默认将整行进行比较,从第一个字符依次开始比较,从小到大排序。
参数 | 含义 |
---|---|
-c | 测试文件是否已经排序 |
-f | 忽略大小写,将小写字母转换大写字母后比较 |
-n | 根据算数值比较 |
-R | 根据哈希值随机排序 |
-r | 颠倒排序结果,默认是从小到大 |
-k | 定义排序比较的关键列 |
-m | 合并已经排序好的文件,不进行重新排序 |
-t | 指定列分割符,默认是空格,一行最多包括10列 |
-u | 删除重复的行,保留第一个 |
-b | 忽略列前面的空格,用第一个非空格字符开始比较 |
-k 列1,列2 ------ 指定比较的关键列。优先比较列1,在列1相同的情况再比较列2。如果想只通过一个列进行比较需要写成*-k 列1,列1*。而并非*-k 列1*,这种写法代表着从列1开始到结束,省略了结束列而已。
sort -b -k 2,3 test.txt
结果:
-k 列1.位置1,列2.位置2-------比较的关键部分从列1的位置1开始到列2的位置2结束。用来将比较部分限定到某列的一部分,而不是全部。
sort -b -k 2.2,2.2 test.txt
结果:
-r --------根据关键字降序排列,默认是从小到大排序
sort -b -r -k 2,3 test.txt
结果:
-n-------将关键字看做数值进行排序。默认是看做字符串,按照字符串顺序进行排序。
sort -b -n -k 3,3 test.txt
结果:
下图是另一种写法,将参数放到指定的比较位置的后面,放到那个列后面代表在哪个列生效,放在前面则是全部生效。
sort -b -k 3,3nr test.txt
-k 列1,列2 -k 列3,列4----------可以通过多个-k参数指定多个比较列。在第一个指定的比较列相同时,第二个指定的比较列才生效。下面的例子是先比较第二列,在第二列相同时,再通过第三列按数值从大到小排序。
sort -b -k 2,2 -k 3,3nr test.txt
结果:
-t 分隔符-------通过该参数自定义列的分隔符。默认是连续的空格或制表符为分割符。下面命令就是讲冒号设定为列分隔符,并讲第三列作为比较列,进行数值比较排序。
sort -t : -k 3n,3 /etc/passwd
-u-------对于重复的行进行去重,保留第一行。
sort -b -u -k 2,2 test.txt
结果:
sort 文件1 文件2-----可以通过这种方式将两个文件合并在一起,并整体进行排序;如果只想单纯的合并不想排序,可以加个-m参数。
sort test.txt test1.txt
cut命令
格式:cut 参数 文件。可以从文本文件中选取某些文本列。
参数 | 含义 |
---|---|
-c | 选择指定的字符 |
-b | 选择指定的字节 |
-d | 自定义列的分隔符,默认是制表符 |
-f | 选择指定的列 |
-s | 不输出不包含分隔符的行 |
-f 列1,列2,列3-列4------用该参数选取指定的列,多个列用逗号隔开,可以通过-表示连续的列。打印出来的列与列之前还是用分隔符隔开。
-d 分隔符------用该参数自定义列的分隔符,默认是制表符。用分隔符分好列后便可以通过-f参数获取想要获取的部分列。
下面命令是通过冒号将/etc/passwd文件每行进行分列,然后获取第一列,第二列,第五到七列。
cut -d ":" -f 1,3,5-7 /etc/passwd
-c 字符1,字符2,字符3-字符4-----用该参数选取指定的字符,多个字符用逗号隔开,可以通过-表示连续的列。
下面命令是获取每行的第一个字符,第二个字符,第五到第七个字符,由于是获取单个字符,无需进行分列。
cut -c 1,3,5-7 /etc/passwd
-s-------用该参数排除掉不含分隔符的行。不用该参数默认会打印出没有分隔符的行所有内容。只要行中有一个列分隔符,都会被含有该参数的cut命令输出。
cut -s -d ":" -f 1,3,5-7 test.txt
paste命令
格式:paste 参数 文件1 文件2 … 。将多个个文件的行并行的连接在一起,并输出。
paste test1.txt test2.txt
结果:左一列是test1.txt内容,右一列是test2.txt内容
参数 | 含义 |
---|---|
-d | 指定拼接的两个文件中对应行之间的分隔符,默认是制表符 |
-s | 将一个文件中的多行数据合并为一行进行显示,在将后一个文件追加到前一个文件的下面一行 |
paste -d ":" test1.txt test2.txt
paste -s test1.txt test2.txt
如果想要分别从两个文件中各选取几列,拼接在一起。可以先用cut命令分别获取到对应列并重定向新文件,然后拼接;或者先拼接,再用paste命令拼接。
join命令
格式:join 参数 文件1 文件2。将文件1和文件2的文本行基于关键字进行拼接。就像关系型数据库中的多表级联查询。注意只能拼接两个文件。
join test1.txt test2.txt
test1.txt:
test2.txt:
上面命令的运行结果如下图:可以看出,连个文件分别以第一列为关键字,相等的便拼接在了一起,并且关键列只输出了一次。test1文件中的第七行和test2中的第七行由于关键字不一致便被舍弃。
参数 | 含义 |
---|---|
-1 列号 | 将第一个文件的指定列设为比较的关键列 |
-2 列号 | 将第二个文件的指定列设为比较的关键列 |
-a 文件号 | 输出指定文件的不匹配的行,文件号可取1或2分别代表两个文件。默认不输出未匹配到的行 |
-e 字符串 | 使用字符串代替空列(找不到的列) |
-i | 在进行比较关键列时,忽略大小写 |
-t | 自定义列分隔符 |
-o | 自定义输出列 |
-1 列号 -2 列号------指定比较的关键列。默认是将两个文件第一列作为关键列
test2.txt改为如图:
join -1 1 -2 2 test1.txt test2.txt
结果:将第一个文件的第一列和第二个文件的第二列设为比较的关键列,两列比较如果相同便进行拼接。依然省略第二个文件的关键列,关键列只打印了一次
-a 文件号-----将指定的文件的不匹配的行也进行输出。文件号可选1或2 分别代表第一个和第二个文件;如果想同时指定两个文件可以写为-a 1 -a 2。
join -1 1 -2 2 -a 1 test1.txt test2.txt
结果:命令通过-a 1将第一文件即test1中的不匹配的行也进行了输出,类似数据库中的左外连接
join -1 1 -2 2 -a 2 test1.txt test2.txt
结果:命令通过-a 2将第二个文件即test2中的不匹配的行也进行了输出,类似数据库中的又外连接
join -1 1 -2 2 -a 1 -a 2 test1.txt test2.txt
结果:命令通过-a 1 -a 2将两个文件中不匹配的行也进行了输出,类似数据库中的全外连接。如果不加-a参数,两个文件中的不匹配的行便不会输出,类似数据中的内连接
-o 文件号.列号 文件号.列号 … ----通过-o指定输出某个文件中的某列。不加该参数默认是全输出
join -1 1 -2 2 -o 1.1 2.1 2.3 test1.txt test2.txt#如果这个写法报错就使用下行的写法
join -1 1 -2 2 -o 1.1 -o 2.1 -o 2.3 test1.txt test2.txt
结果:通过-o指定输出第一个文件的第一列,第二个文件第一列和第三列。除了指定的列其他列并且有输出(我在mac本上试第一行命令报错,第二行命令可以执行,如果报错分别用两种写法试试)
-e 字符串----如果在文件中找不到指定的列,用指定的字符串代替该列。
join -1 1 -2 2 -o 1.1 -o 2.1 -o 2.3 -o 2.4 -e '!!!' test1.txt test2.txt
结果:上面命令指定输出了test2文件的第四列,但是因为不存在第四列,便输出了指定的字符串
-t 字符串----如果文件1和文件2中的列分隔符不是默认的制表符,可以通过该参数指定分隔符。
将test1文件改为:
将test2文件改为:
join -1 1 -2 2 -t ":" test1.txt test2.txt
结果:两个文件的分隔符改了冒号,通过-t指定冒号为列分隔符,可以看到输出的结果列分隔符也是冒号。
tr命令
格式:tr 参数 字符集1 字符集2 -----用字符集2替换文本中的字符集1。
tr "[a-z]" "[A-Z]" < test1.txt
上面的命令是将test1.txt文件中的小写字母替换为大写字母。注意tr命令不能直接操作文件,所以通过重定向的方式给tr命令文本内容。而修改后的内容只是输出,并不会修改源文件内容
参数 | 含义 |
---|---|
-c | 用字符集2替换文本中 没有在字符集1中的字符 |
-d | 删除文本中在字符集1中的所有字符 |
-s | 压缩文本中字符集1中的字符,即连续几个相同的字符只保留一个 |
tr "one" "ONE" <test1.txt
结果:上面命令是将test1.txt文件中小写的o替换成大写的O,小写的n替换成大写的N,小写的e替换成大写的E。注意:替换的是字符级别,而不是完整的one字符串替换成ONE字符串。
-s 字符集1 ----- 将文本中的在字符集1的字符,连续出现的几个压缩成一个。
cat test3.txt | tr -s "[a-z][0-9]"
源文件:
结果:将test3中的连续出现的小写字母和数字压缩成一个。
cat test4.txt | tr -s "[\n]"
上面的命令将连续回车压缩成一个回车,即删除空行。
-d 字符集1 ------将文本中在字符集1中的字符删除掉。
tr -d "[a-z][:]" < test1.txt
结果:将小写字母以及冒号都删掉了,就剩数字了。
-c 字符集1 字符集2-----将文本中,不在字符集1中的字符,替换成字符集2。
tr -cs "[0-9]" "\n" < test1.txt
上面命令是将非数字都替换成回车,然后降连续的回车压缩成一个回车,结果和上图一样。
-------------------------------学习自“shell从入门到精通”--------------------------------------------