Linux:strings 工具常用方法

Linux:strings 工具常用方法

strings - print the strings of printable characters in files.

strings prints the printable character sequences that are at least 4 characters long and are followed by an unprintable character.

strings is mainly useful for determining the contents of non-text files.

string 工具可以对任何文件的内容进行分析,并输出可打印字符长度不小于4的串。

这里“任何文件”,包括文本文件和二进制文件。

其实“文本文件”和“二进制文件“两者并没有啥差别,所有的文件本质都是 Binary,文本文件只不过是一些特殊的 Binary 。

这里“连续的可打印字符最小长度”是可以被选项设置的,并非固定不可修改的4。

常用选项:

-f Print the name of the file before each string.
-n Print sequences of characters that are at least min-len characters long, instead of the default 4.

Code:

/*
 * Filename     : main.c
 * Author       : jiang
 * Description  : test-file
 * Date         : 2018/07/09 22:03:57
 */
char MODULE_VER[] = "REDISDRIVER_VER_0.17_20180709";

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main()
{
    printf("1\n");
    printf("22\n");
    printf("333\n");
    printf("4444\n");
    printf("55555\n");
    printf("666666\n");

    printf("update something\n");

    printf("global unique identifier\n");

    return 0;
}

编译 && 运行:

[test1280@localhost ~]$ gcc -o main main.c
[test1280@localhost ~]$ ./main
1
22
333
4444
55555
666666
update something
global unique identifier

Case 1:

快速查看模块版本。

我们项目组的每个程序模块,都有一个模块子版本号来唯一标识。

例如上面代码中的:

char MODULE_VER[] = "REDISDRIVER_VER_0.17_20180709";

假如我在一个装有我们项目组研发的软件平台环境中看到一个模块,如何快速地确定这个模块的版本呢?

使用 strings 命令 + grep 命令 可以快速地将版本号过滤查找出来:

[test1280@localhost ~]$ strings main | grep "REDISDRIVER"
REDISDRIVER_VER_0.17_20180709

Case 2:

快速定位某源文件编译生成哪个 Binary 文件。

例如在 main.c 文件中有:

printf("global unique identifier\n");

我想要知晓,main.c 源文件最后会编译到哪个 Binary 文件中,如何查找呢?

[test1280@localhost ~]$ strings -f * | grep "global unique identifier"
main: global unique identifier
main.c:     printf("global unique identifier\n");

从上面的输出可以看到,main.c 源文件最后编译到 main Binary 文件中啦!

注:由于 * 包含了 main.c 源文件,自然输出了源文件 main.c 一项。优化时可以判断是否有 x 权限,等等。


Case 3:

快速确认 重新编译 是否成功。

当项目很庞大时,如果更新单个文件,然后重新 make 可能由于五花八门的各类原因导致编译、链接错误,使得更新过的代码并未正确反映到对应的可执行文件中。

例如:

更新前为

    printf("update something\n");
[test1280@localhost ~]$ strings main | grep "update something"
update something

更新后为

printf("update something @ 20180709 by jiang\n");
[test1280@localhost ~]$ strings main | grep "20180709 by jiang"
update something @ 20180709 by jiang

这样我们可以在不运行程序之前,确认代码是否更新成功。


注:

通过 -n 可以设置“连续的可打印字符最小长度”。

如果一个可打印字符串满足这个长度才会输出,否则将不输出。

举个栗子:

输出大于等于6的字符串

[test1280@localhost ~]$ strings -n 6 main 
/lib64/ld-linux-x86-64.so.2
__gmon_start__
libc.so.6
__libc_start_main
GLIBC_2.2.5
fffff.
666666
update something @ 20180709 by jiang
global unique identifier
REDISDRIVER_VER_0.17_20180709

可以观察到,”666666” 被输出出来,其余的可打印字符串由于长度“不达标”故并未输出。

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
strings.com 是强大的纯DOS环境 下的文本处理工具 STRINGS常用方法: 1、把文本文件 LIST.TXT 包含的行数赋值给变量 LN STRINGS LN=LINESIZE LIST.TXT 2、把文本文件 LIST.TXT 的大小传递给变量FS STRINGS FS=FILESIZE LIST.TXT 3、读取文本文件 LIST.TXT 的第5行内容并赋值给变31333137量 LN STRINGS LN=READ LIST.TXT,5 4、把变量 N 在原有基础上+1 和 -1 STRINGS N=ADD %N%,1 STRINGS N=SUB %N%,1 5、把字符串 ABCDEFG 中第四个字符以及后面共3个字符传递给变量 LX (DEF) STRINGS LX=MID ABCDEFG,4,3 6、查找字符串 ABCDEFG 中D所在的位置并赋值给变量DX,如果没找到DX=0 STRINGS DX=FIND ABCDEFG,D 7、找出字符串 ABCD EFG HIJ KLMN 中第二个单词并赋值给变量L2 STRINGS L2=PARSE ABCD EFG HIJ KLMN ,2 应用举例:逐一显示文件 LIST.TXT 各行内容 @ECHO OFF REM 读取LIST.TXT大小如果是0就转入 ERROR段 STRINGS FS=FILESIZE LIST.TXT IF %FS%*==0* GOTO ERROR REM 读取 LIST.TXT 行数 并用N作计数器以循环方式显示 LIST.TXT各行内容。 STRINGS L=LINESIZE LIST.TXT STRINGS L=ADD %L%,1 SET N=0 :LOOP STRINGS N=ADD %N%,1 STRINGS LX=READ LIST.TXT,%N% ECHO %LX% IF %N%*==%L%* GOTO END GOTO LOOP :ERROR ECHO LIST.TXT IS NULL :END SET FS= SET L= SET N= SET LX= --------------------------------------------- NSET 的常用方法: 1、把某一命令的执行结果传递给变量。 A.把 DIR 命令执行结果第7行中的第2个单词传递给变量 DIRX DIR /A /S |NSET /L7 DIRX=$2 B.把当前路径传递给变量 CDX CD |NSET CDX=$0 2、获取 LIST.TXT 文件第5行第2个单词的内容并赋值给变量 L52 NSET /L5 L52=$2 <LIST.TXT 举例:显示出 LIST.TXT 文件中第二个单词是 SYSTEM 的行的内容。 @ECHO OFF REM 读取LIST.TXT大小如果是0就转入 ERROR段 STRINGS FS=FILESIZE LIST.TXT IF %FS%*==0* GOTO ERROR REM 读取 LIST.TXT 行数 并用N作计数器以循环方式显示 LIST.TXT中第二个单词是 REM SYSTEM 的行的内容,每找到一个符合条件的行,就把变量M在原有基础上+1。 STRINGS L=LINESIZE LIST.TXT STRINGS L=ADD %L%,1 SET N=0 SET M=0 :LOOP STRINGS N=ADD %N%,1 STRINGS LX=READ LIST.TXT,%N% REM STRINGS LX2=PARSE %LX%,2 NSET /L%N% LX2=$2 diskn.txt REM 如果存在DISKN2.TXT 就删除之 if exist diskn2.txt del diskn2.txt >nul REM 获取DISKN.TXT文件行数并用N做计数器逐行判断,并把需要的信息传递给DISKN2.TXT REM 如果该行前两个字符是 NO 说明没有硬盘,就退出脚本 RE

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值