字符串三剑客: awk
awk
是一个强大的文本处理工具,用于处理结构化文本数据。以下是一些在使用 awk
时的小技巧:
基本用法:
1
awk '{print $1}' filename
这将打印文件中每行的第一个字段。
指定字段分隔符:
1
awk -F':' '{print $1}' /etc/passwd
这将使用冒号作为字段分隔符来处理
/etc/passwd
文件。
awk
是一个强大的文本处理工具,用于处理结构化文本数据。以下是一些在使用 awk
时的小技巧:
基本用法:
1 | awk '{print $1}' filename |
这将打印文件中每行的第一个字段。
指定字段分隔符:
1 | awk -F':' '{print $1}' /etc/passwd |
这将使用冒号作为字段分隔符来处理 /etc/passwd
文件。
在 C++ 中,符号修饰是指编译器对函数和变量名进行的一种变换或修饰。这种修饰是为了解决 C++ 的函数重载、命名空间和类等特性引入的命名冲突问题。通过符号修饰,编译器可以在目标文件中唯一标识不同的实体,确保在链接阶段能够正确地找到并匹配相应的函数或变量。
C++ 编译器通过一种名为“名字翻译”(Name Mangling)的技术来实现符号修饰。名字翻译将源代码中的函数和变量名转换成目标文件中的唯一标识符。这种转换过程包括以下几个方面:
C++ 允许函数重载,即在同一作用域内定义多个同名函数,但它们的参数类型或个数不同。为了在目标文件中区分这些重载函数,编译器会根据函数的参数类型和个数生成不同的符号。
命名空间是 C++ 中组织代码的一种方式,但它可能导致相同名字的函数或变量在目标文件中发生冲突。符号修饰通过在符号前添加命名空间信息,解决了这一问题。
类的成员函数通常需要包含类的信息,以便正确访问对象的成员。符号修饰通过在符号中嵌入类的信息,确保了正确的成员函数匹配。
考虑以下 C++ 代码片段:
1 |
|
通过编译并查看符号表,我们可以看到 Math::Calculator::add
函数的符号修饰:
1 | $ nm a.out | grep add |
在这个例子中,符号 _ZN4Math9Calculator3addEii
就是经过修饰的 Math::Calculator::add
函数名。
在正常情况下,大多数 C++ 程序员在日常编程中不需要过多关注符号修饰。编译器会自动处理符号修饰,而开发者通常只需使用函数和变量的原始名称即可。只有在涉及到库的开发、跨语言交互或者遇到符号冲突的特殊情况下,才需要更深入地了解符号修饰。
sed
小技巧:
替换字符串:
1 | sed 's/old_string/new_string/g' filename |
这将在文件中将所有的 old_string
替换为 new_string
。
删除行:
1 | sed '/pattern/d' filename |
这将删除包含指定模式的行。
grep
命令小技巧
简单搜索:
1 | grep "pattern" filename |
这将在文件中搜索匹配指定模式的行。
忽略大小写:
1 | grep -i "pattern" filename |
-i
选项将忽略大小写。
有些时候我们开发需要接触涉及到一些sftp接口,比如 sftp 上传文件, sftp下载文件,这时候可以用 docker 快速的搭建一个sftp server 用于测试开发。
拉镜像
1 | docker pull atmoz/sftp |
启动 sftp 服务
1 | docker run -d -v /path/to/shared/folder:/home/username/upload -p 2222:22 -e SFTP_USERS=username:password:::upload atmoz/sftp |
测试
1 | sftp -P 2222 username@localhost:/upload/xxx xxx |