用一条shell命令,提取出包含 initcal 的行,删除方括号及里面的内容,并按 after 后面的时间大小重新对文本降序排序,最后在行首添加时间和单位
时间: 2024-03-27 16:41:15 浏览: 25
可以使用一条比较长的管道命令来实现:
```bash
grep "initcall" input.txt | sed -e "s/\[.*\]//g" | awk '/after/ {match($0, /after ([0-9]+) ([a-zA-Z]+)/, arr); print arr[1]" "arr[2]" "$0}' | sort -k1rn -k2 | sed -e "s/^[^ ]* [^ ]* //" > output.txt
```
这里使用grep命令提取包含initcall的行,使用sed命令删除方括号及里面的内容,使用awk命令提取出after后面的时间和单位,并在行首添加时间和单位,最后使用sort命令按时间大小降序排序,最后使用sed命令删除添加的时间和单位,并将结果写入output.txt文件中。
相关问题
用shell脚本,提取出包含 initcal 的行,删除方括号及里面的内容,并按 after 后面的时间大小重新对文本降序排序,最后在行首添加时间和单位
好的,以下是一个Shell脚本的示例,可以实现您的需求:
```bash
#!/bin/bash
# 提取出包含 initcal 的行,并删除方括号及里面的内容
initcal_lines=$(grep "initcall" input.txt | sed -e "s/\[.*\]//g")
# 提取出 after 后面的时间
time_dict=()
while read -r line; do
if [[ $line =~ after\ ([0-9]+)\ ([a-zA-Z]+) ]]; then
time=${BASH_REMATCH[1]}
unit=${BASH_REMATCH[2]}
time_dict[$line]="$time $unit"
fi
done <<< "$initcal_lines"
# 按时间大小排序
sorted_lines=$(for line in "${!time_dict[@]}"; do echo "$line"; done | sort -k2rn)
# 在行首添加时间和单位
result_lines=()
while read -r line; do
result_lines+=("${time_dict[$line]} $line")
done <<< "$sorted_lines"
# 将结果写入新的文件
printf '%s\n' "${result_lines[@]}" > output.txt
```
请将上述代码保存为Shell脚本文件,将文本文件命名为input.txt并放在与脚本相同的目录下,然后运行脚本即可。执行完毕后,将按时间大小降序排列的结果写入output.txt文件中。
请用shell命令给上面的文本按after 后面的数字排序
可以使用`awk`命令和`sort`命令来实现按`after`后面的数字排序。具体命令如下:
```
awk -F'after ' '{print $2 " " $0}' file.txt | sort -n | cut -d' ' -f2-
```
解释:
- `awk -F'after ' '{print $2 " " $0}' file.txt`:将每行文本按照`after`关键字分割,然后将`after`后面的数字和整行文本一起输出;
- `sort -n`:按照数值大小进行排序;
- `cut -d' ' -f2-`:去掉排序结果中的数字,只输出原始文本内容。
注意,上述命令中的`file.txt`需要替换为实际的文件名。如果需要对标准输入(stdin)进行排序,可以省略文件名,并将命令改为:
```
cat file.txt | awk -F'after ' '{print $2 " " $0}' | sort -n | cut -d' ' -f2-
```
其中,`cat file.txt`命令会将文件内容输出到标准输出,然后通过管道符(`|`)将输出结果传递给`awk`命令。