Linux CMD
find
more in blog
1 | find . -type f -size +10M -exec rm -rf {} \; |
{}
is a placeholder that is used to hold results given by the find command.\;
says that for each found result, the [command] is executed
awk
awk
是一种强大的文本处理工具,通常用于扫描和处理文本文件中的数据。它非常适合用于格式化和提取数据。以下是一些基本用法和概念:
基本结构
awk
的基本结构是:
1 | awk 'pattern { action }' file |
- pattern: 用于匹配的条件。如果匹配成功,则执行
{ action }
。 - action: 你希望对匹配的行执行的操作。
常见功能
打印特定列:
1
awk '{print $1, $3}' file.txt
这将打印每行的第一和第三列。
按条件过滤行:
1
awk '$1 > 50' file.txt
这将打印第一列大于 50 的所有行。
使用分隔符:
1
awk -F ':' '{print $1}' /etc/passwd
这将使用冒号
:
作为分隔符,并打印每行的第一列。计算和统计:
1
awk '{sum += $1} END {print sum}' file.txt
这将计算第一列的总和并在最后输出。
数组和循环:
1
awk '{count[$1]++} END {for (i in count) print i, count[i]}' file.txt
这将统计第一列每个值的出现次数。
实用示例
内置变量
在 awk
中,NR
和 NF
是非常常用的内置变量,用来处理数据时非常方便。让我们详细解释一下这些变量,以及一些其他常见的内置变量:
总结:
NR
:当前记录(行)的行号。NF
:当前行的字段数。$0
:当前行的全部内容。$n
:当前行的第 n 个字段。
这些变量能够让 awk
在处理文本时非常灵活和强大。
sed
sed
是一种流编辑器(stream editor),主要用于查找、替换、插入、删除文本中的内容。与 awk
不同,sed
更专注于对文件或文本流的逐行处理,非常适合进行快速的文本替换和编辑任务。
基本结构
sed
的基本使用格式如下:
1 | sed 's/pattern/replacement/flags' file |
s
: 代表替换(substitute)。pattern
: 要匹配的字符串模式。replacement
: 用来替换匹配模式的字符串。flags
: 替换行为的选项(例如g
代表全局替换,即一行中多次出现的匹配项都替换)。
常见用法
替换单个匹配项:
1
sed 's/old/new/' file.txt
这将把
old
替换为new
,**每行只替换第一个匹配到的old
**。全局替换(替换一行中的所有匹配项):
1
sed 's/old/new/g' file.txt
在每行中将所有出现的
old
替换为new
。直接修改文件(默认情况下,
sed
不会修改文件,只是打印输出结果):1
sed -i 's/old/new/g' file.txt
-i
选项会直接修改文件内容。指定替换某一行的匹配项:
1
sed '3s/old/new/' file.txt
只替换第 3 行中的第一个匹配项。
删除行:
1
sed '3d' file.txt
删除文件中的第 3 行。
删除包含某个模式的行:
1
sed '/pattern/d' file.txt
删除所有包含
pattern
的行。打印特定行:
1
sed -n '3p' file.txt
打印文件中的第 3 行。
-n
表示禁止默认输出,只打印指定的行。
假设你有以下一行数据:
1
FunctionProfiler: Profiling completed, data saved to /tmp/cpp_3921738/3921738_output.txt
提取 /tmp/cpp_{tid}
的部分,即路径 /tmp/cpp_3921738/
。
1 | grep 'FunctionProfiler' your_file | sed -n 's/.*\(\/tmp\/cpp_[0-9]\+\/\).*/\1/p' |
解释:
grep 'FunctionProfiler'
:先使用grep
提取包含FunctionProfiler
的行。sed -n
:-n
选项表示不自动输出,而是仅在匹配时输出。s/.*\(\/tmp\/cpp_[0-9]\+\/\).*/\1/
:使用sed
替换命令来捕获匹配的部分。.*
:匹配任意前导字符。\(\/tmp\/cpp_[0-9]\+\/\)
:这是我们要提取的部分,匹配/tmp/cpp_
后跟一个或多个数字,使用\1
引用。.*
:匹配剩余的字符。p
:表示打印匹配的结果。
这个命令会输出路径 /tmp/cpp_3921738/
。
- 查找并替换带有特殊字符的字符串:
当要替换的字符串中含有特殊字符(如/
),可以使用其他字符作为分隔符。例如:在这个例子中,1
sed 's|/old/path|/new/path|g' file.txt
|
被用作分隔符,避免了/
字符冲突。
实用示例
在某行之后插入内容:
1
sed '3a This is the inserted line.' file.txt
在第 3 行后插入
"This is the inserted line."
。在某行之前插入内容:
1
sed '3i This is the inserted line.' file.txt
在第 3 行前插入
"This is the inserted line."
。替换特定范围内的行:
1
sed '3,5s/old/new/g' file.txt
仅替换第 3 行到第 5 行中的
old
。替换文件中的多个字符串:
1
sed -e 's/old1/new1/g' -e 's/old2/new2/g' file.txt
使用
-e
选项可以执行多个替换操作。删除文件中的空行:
1
sed '/^$/d' file.txt
删除所有空行。
总结
- 文本替换是
sed
的核心功能,主要用于批量替换和删除。 sed
的语法简单、易用,并且非常适合处理大文件或者进行批量文件处理。- 与
awk
不同,sed
更偏向行操作,对于简单的查找、替换任务非常高效。
cut
提取git id
1 | (cd /root/document/shaojie/github/pytorch; git log | head -n 1 | awk '{print $2}' | cut -c 1-5) |
echo
连续数据 + 可视化
使用 grep
和 sed
来提取数字并将它们格式化为一行,以逗号分隔。下面是一个示例命令:
1 | grep -a 'avg syn forward cost' llama_bindCore_env1.log | sed 's/.*: \([0-9.]*\) ms/\1/' | paste -sd ',' |
grep -a 'avg syn forward cost' llama_bindCore_env1.log
:提取包含指定字符串的行。sed 's/.*: \([0-9.]*\) ms/\1/'
:使用sed
将每行转换为仅包含数字。这里,.*:
表示匹配行中前面的所有内容,\([0-9.]*\)
捕获数字(包括小数点),ms
后面的部分会被删除。paste -sd ','
:将所有输出合并为一行,并用逗号分隔。
运行这个命令后,你将得到一个逗号分隔的数字列表。
正态分布图
运行histogram.sh input.txt > echart.data
, 输入数据是一行一个数据。
脚本如下:
1 | min=50 # 数据的最小值 |
参考文献
上面回答部分来自ChatGPT-4omini,没有进行正确性的交叉校验。