sort ,uniq ,tr ,cut命令

本文详细介绍了Linux系统中用于文本处理的四个重要命令:sort用于排序,uniq用于处理重复行,tr用于字符替换和删除,cut则用于提取文件中的特定字段。每个命令都提供了具体的选项和使用示例,展示了它们在实际问题中的应用,如日志分析和数据整理。
摘要由CSDN通过智能技术生成

目录

一、sort命令

1.格式

2.命令演示

2.1 选项 -n :按照数字大小排序

 2.2选项 -r :反向排序

 2.3选项 -u:隐藏多余行

2.4选项 -t  :指定分隔符;-k :指定字符;-o :指定保存文件

二、uniq命令

1.语法格式 

2.命令演示

2.1只使用uniq命令只隐藏连续重复的多余行

2.2选项-c :对连续重复行进行计数,并删除重复行

2.3选项 -u :仅显示出现一次的行

2.4选项 -d :仅显示连续重复的行

3.实际应用

3.1将远程破解主机密码的ip进行筛选,将这些ip输入到/etc/host.deny文件中,远程登录密码输入错误的IP地址会记录在 /var/log/secure 日志文件中

3.2利用脚本实现操作

三、tr命令

1.语法格式

2.命令演示

2.1选项 -c :保留字符集1的字符,其他字符用字符集2字符替换

2.2 选项 -d :删除字符集1的字符

2.3选项 -s :将重复字符压缩成一个字符

2.4选项 -s :将字符集2字符替换字符集2的字符

3.用命令对数组中的值进行排序

四、cut命令

1.语法格式

2.命令演示

2.1选项 -f:提取指定字符  ; -d :指定分隔符

2.2选项 --output-delimiter :更改输出内容的分隔符

2.3选项 -complement :输出排除字段


一、sort命令

以行为单位对文件内容进行排序,也可以根据不同的数据类型来排序。

比较原则:从首字符向后,依次按ASCII码值进行比较,最后将他们按升序输出。

1.格式

sort [选项] 参数
一般配合 cat 命令使用
cat file | sort 选项

常用选项:
-n:按照数字进行排序
-r:反向排序
-u:等同于uniq,表示相同的数据仅显示一行
-t:指定字段分隔符,默认使用tab键分隔
-k:指定排序字段
-o <输出文件>:将排序后的结果转存至指定文件
-f:忽略大小写,会将小写字母都转换为大写字母来进行比较
-b:忽略每行前面的空格

2.命令演示

#不加选项排序
sort 123.txt 
1
12
125
13
13
142
153
5
51
61

2.1 选项 -n :按照数字大小排序

sort -n 123.txt 
1
5
12
13
13
51
61
125
142
153

 2.2选项 -r :反向排序

sort -nr 123.txt 
#不加-n,从首字符依次向后比较
153
142
125
61
51
13
13
12
5
1

 2.3选项 -u:隐藏多余行

cat 123.txt 
1
12
5
12
61
61
13
sort -u 123.txt 
#将相同行多余行隐藏,只显示一行
1
12
13
5
61

2.4选项 -t  :指定分隔符;-k :指定字符;-o :指定保存文件

sort -t '.' -k 4 -n 123.txt -o abc.txt
cat abc.txt
192.168.88.10
192.168.88.20
192.168.88.52
192.168.88.62
192.168.88.100
192.168.88.201

二、uniq命令

用于报告或者忽略文件中连续的重复行,常与 sort 命令结合使用

1.语法格式 

格式:
   uniq [选项] 参数
   cat file | uniq

常用选项:
-c:进行计数,并删除文件中重复出现的行
-d:仅显示连续的重复行
-u:仅显示出现一次的行

2.命令演示

2.1只使用uniq命令只隐藏连续重复的多余行

cat 123.txt 
12
15
12
666
777
222
222
uniq 123.txt 
12
15
12
666
777
222

2.2选项-c :对连续重复行进行计数,并删除重复行

uniq -c 123.txt 
      1 12
      1 15
      1 12
      1 666
      1 777
      2 222
#将文件中所有重复行进行计数
sort -n 123.txt | uniq -c
      2 12
      1 15
      2 222
      1 666
      1 777

2.3选项 -u :仅显示出现一次的行

uniq -u 123.txt 
12
15
12
666
777
#将文件行进行排序,然后显示出现一次的行
sort -n 123.txt | uniq -u
15
666
777

2.4选项 -d :仅显示连续重复的行

uniq -d 123.txt 
222
sort -n 123.txt | uniq -d
12
222

3.实际应用

3.1将远程破解主机密码的ip进行筛选,将这些ip输入到/etc/host.deny文件中,远程登录密码输入错误的IP地址会记录在 /var/log/secure 日志文件中

将这一行内容从日志文件中提取出来

 提取出登录失败的IP地址

排序IP地址并计数

3.2利用脚本实现操作

#!/bin/bash

cat /var/log/secure | grep "Failed password" | awk '{print $11}' | sort -n | uniq -c > ./abc.txt
IFSA=$IFS
IFS=$'\n'
for i in  `cat ./abc.txt`
do
  num=$(echo $i | awk '{print $1}')
  #将大于3次密码错误的远程连接的IP筛查出来 
  if [ $num -gt 3 ]
  then
    ip=$(echo $i | awk '{print $2}')
   #将ip加入/etc/hosts.deny文件,拒绝访问
    echo "sshd:$ip" >> /etc/hosts.deny
  fi
done

IFS=$IFSA

三、tr命令

常用来对来自标准输入的字符进行替换,压缩和删除

1.语法格式

格式:
    tr [选项] 参数
参数:
字符集1:指定要转换或删除的原字符集。当执行转换操作时,必须使用参数“字符集2”指定转换
的目标字符集。但执行删除操作时,不需要参数“字符集2”
字符集2:指定要转换成的目标字符集

常用选项:
-c:保留字符集1的字符,其他字符(包括换行符 \n)用字符集2替换
-d:删除所有属于字符集1的字符
-s:将重复出现的字符串压缩为一个字符;用字符集2 替换 字符集1
-t:字符集2 替换 字符集1,不加选项同结果

2.命令演示

#将a-z 替换为 A-Z
echo "abc" | tr "a-z" "A-Z"
ABC
#将原字符 a 替换为 A
echo "abc" | tr "a" "A"
Abc
#将字符 ac 替换为 AC
echo "abc" | tr "ac" "AC"
AbC

2.1选项 -c :保留字符集1的字符,其他字符用字符集2字符替换

echo -e "ab\nadc\nabcd" > 123.txt
cat -A 123.txt 
ab$
adc$
abcd$
echo -e "ab\nadc\nabcd" | tr -c "ab" "0"
ab0a000ab000
echo -e "ab\nadc\nabcd" | tr -c "ab\n" "0"
ab
a00
ab00

2.2 选项 -d :删除字符集1的字符

echo "hello world" | tr -d "wld"
heo or
echo "hello world" | tr -d " "
helloworld
echo "hello world" | tr -d "ho"
ell wrld

2.3选项 -s :将重复字符压缩成一个字符

echo "hello    world" | tr -s "l"
helo    world
echo "hello    world" | tr -s "l "
helo world
echo -e "a\n\n\nb\n\n\nc"
a


b


c
echo -e "a\n\n\nb\n\n\nc" | tr -s "\n"
a
b
c
echo -e "a\n\n\nb\n\n\nc" | tr -d "\n"
abc

2.4选项 -s :将字符集2字符替换字符集2的字符

echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
#用空格替换冒号
echo $PATH | tr -s ":" " "
/usr/local/sbin /usr/local/bin /usr/sbin /usr/bin /root/bin
#用逗号替换冒号
echo $PATH | tr -s ":" ","
/usr/local/sbin,/usr/local/bin,/usr/sbin,/usr/bin,/root/bin

3.用命令对数组中的值进行排序

array=(1 65 32 24 12 23 15)
echo ${array[@]}
1 65 32 24 12 23 15
echo ${array[@]} | tr " " "\n"
1
65
32
24
12
23
15
echo ${array[@]} | tr " " "\n" |sort -n
1
12
15
23
24
32
65
echo ${array[@]} | tr " " "\n" |sort -n | tr "\n" " "
1 12 15 23 24 32 65

四、cut命令

显示行中的指定部分,删除文件中指定字段

1.语法格式

格式:
    cut 参数
    cat file | cut 选项
常用选项:
-f:通过指定哪一个字段进行提取
-d:指定分隔符,默认分隔符为tab
--complement:用于排除所指定的字段
--output-delimiter:更改输出内容的分隔符

2.命令演示

2.1选项 -f:提取指定字符  ; -d :指定分隔符

tail -3 /etc/passwd
wangwu:x:1003:1003::/home/wangwu:/bin/bash
wolong:x:1004:1004::/home/wolong:/bin/bash
fengchu:x:1005:1005::/home/fengchu:/bin/bash

tail -3 /etc/passwd | cut -d ":" -f 1
wangwu
wolong
fengchu

tail -3 /etc/passwd | cut -d ":" -f 1,3
wangwu:1003
wolong:1004
fengchu:1005

tail -3 /etc/passwd | cut -d ":" -f 1,3,7
wangwu:1003:/bin/bash
wolong:1004:/bin/bash
fengchu:1005:/bin/bash

2.2选项 --output-delimiter :更改输出内容的分隔符

tail -3 /etc/passwd | cut --output-delimiter=" " -d ":" -f 1,3
wangwu 1003
wolong 1004
fengchu 1005

tail -3 /etc/passwd | cut --output-delimiter="," -d ":" -f 1,3
wangwu,1003
wolong,1004
fengchu,1005

#awk命令与cut命令效果相似,输出内容默认分隔符为空格
tail -3 /etc/passwd | awk -F: '{print $1,$3}'
wangwu 1003
wolong 1004
fengchu 1005
tail -3 /etc/passwd | awk -F: '{print $1","$3}'
wangwu,1003
wolong,1004
fengchu,1005
tail -3 /etc/passwd | awk -F: '{print $1":"$3}'
wangwu:1003
wolong:1004
fengchu:1005

2.3选项 -complement :输出排除字段

tail -3 /etc/passwd 
wangwu:x:1003:1003::/home/wangwu:/bin/bash
wolong:x:1004:1004::/home/wolong:/bin/bash
fengchu:x:1005:1005::/home/fengchu:/bin/bash

tail -3 /etc/passwd | cut --complement -d ":" -f 1,3
x:1003::/home/wangwu:/bin/bash
x:1004::/home/wolong:/bin/bash
x:1005::/home/fengchu:/bin/bash

tail -3 /etc/passwd | cut --complement -d ":" -f 1
x:1003:1003::/home/wangwu:/bin/bash
x:1004:1004::/home/wolong:/bin/bash
x:1005:1005::/home/fengchu:/bin/bash

tail -3 /etc/passwd | cut --complement -d ":" -f 2,3,4,5
wangwu:/home/wangwu:/bin/bash
wolong:/home/wolong:/bin/bash
fengchu:/home/fengchu:/bin/bash

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
k1++; } else if (board[i+k][j+k] == -turn || k1 == 0) { if (k1 > 0) { k2++; } k1 = 0; } if (k1 ==Bash管道(pipe)命令是将多个命令通过管道符(|)连接在一起,使得前一个 6) { value += 10000; } else if (k1 > 0 && i+k > 0 && i命令的输出成为下一个命令的输入,以此类推,形成一个流水线。下面是常+k < ROWS - 1 && j+k > 0 && j+k < COLS - 1 && board[i+k-1用的一些命令: 1. cut:用于剪切文本文件中的字段,可以按列或字符位置进行][j+k-1] == 0 && board[i+k+1][j+k+1] == 0) { value +=剪切。 示例: ``` cut -d',' -f1 file.csv # 按逗号分隔,提取第一 100; // 可以成五 } else if (k1 > 0 && i+k > 0 && i+k <列 cut -c1-5 file.txt # 提取文本文件的前5个字符 ``` 2. grep: ROWS - 1 && j+k > 0 && board[i+k-1][j+k-1] == 0) { value += 10; // 可以成四 } else if (k1 > 0 && i+k < ROWS - 用于按照指定的模式搜索文本文件中的内容,并将匹配的行输出。 示例: ``` 1 && j+k < COLS - 1 && board[i+k+1][j+k+1] == 0) { valuegrep 'pattern' file.txt # 搜索文本文件中包含pattern的行 grep -v 'pattern' file.txt # += 10; // 可以成四 } else if (k1 > 0 && i+k > 1 && j+k 搜索文本文件中不包含pattern的行 ``` 3. sort:用于对文本文件的行进行排序。 > 1 && board[i+k-1][j+k-1] == turn && board[i+k-2][j+k-2]示例: ``` sort file.txt # 按照字典序升序排序 sort -n file.txt # 按照数字 == 0) { value += 5; // 可以成三 } else if (k1 > 0 && i大小升序排序 ``` 4. wc:用于统计文本文件中的行数、单词数和字符数+k < ROWS - 2 && j+k < COLS - 2 && board[i+k+1][j+k+1] ==。 示例: ``` wc -l file.txt # 统计文本文件的行数 wc -w file.txt # turn && board[i+k+2][j+k+2] == 0) { value += 5; // 可以成三 统计文本文件的单词数 wc -c file.txt # 统计文本文件的字符数 ``` 5 } } if (k1 > 0) { k2++; } if (k2 > . uniq:用于去除文本文件中的重复行。 示例: ``` sort file.txt | uniq # 将0) { value += k2 * k2; // 连子数越多,价值越高 } k1文本文件排序并去重 ``` 6. tee:用于将命令的输出同时输出到屏幕和文件中 = 0; k2 = 0; } } // 左下到右上 for (int i =。 示例: ``` ls -l | tee file.txt # 将ls命令的输出同时输出到屏幕和文件中 5; i < ROWS; i++) { for (int j = 0; j < COLS - 5; j ``` 7. tr:用于对文本文件进行字符转换。 示例: ``` tr 'a-z' '++) { for (int k = 0; k < 6; k++) { if (board[i-k][j+k]A-Z' file.txt # 将文本文件中的小写字母转换为大写字母 ``` 8. == turn) { k1++; } else if (board[i-k][j+k] == -turn || k1 == 0) { if (k1 > 0) { k2++; } k1 = 0; } col:用于过滤文本文件中的控制字符。 示例: ``` col -b file.txt # 过滤 if (k1 == 6) { value += 10000; } else if (k1 > 0 && i-k文本文件中的控制字符 ``` 9. join:用于将两个文本文件中的相同字段进行 > 0 && i-k < ROWS - 1 && j+k > 0 && j+k < COLS - 1 && 合并。 示例: ``` join file1.txt file2.txt # 将file1.txt和file2.txt中相同的 board[i-k-1][j+k+1] == 0 && board[i-k+1][j+k-1] == 0字段合并 ``` 10. paste:用于将两个文本文件的对应行合并成一行。 示) { value += 100; // 可以成五 } else if (k1 > 0 && i-k < ROW例: ``` paste file1.txt file2.txt # 将file1.txt和file2.txt的对应行合并成一S - 1 && j+k > 0 && j+k < COLS - 1 && board[i-k+1][j+k行 ``` 11. expand:用于将文本文件中的制表符转换为空格。 示例: ``` expand file.txt # 将文本文件中的制表符转换为空格 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值