2015-09-04 00:08:20 u010487568 阅读数 496

Linux中的所有内容都是以文件的方式表示的,会有很多需求需要我们获取文件的内容,查看部分或者全部内容。当然最直接方式就是使用编辑器打开文件查看,比如vim、vi、emacs等。这里主要关注的是shell命令中获取文件内容的部分。

1.cat

cat命令的用途是连接文件或标准输入并打印。这个命令常用来显示文件内容,或者将几个文件连接起来显示,或者从标准输入读取内容并显示。

1.命令概览

这里写图片描述
在文件内容比较少的时候,可以直接使用cat命令打印出来或者使用管道符传递给后续命令处理文件内容。当然,cat也可以传入多个文件名,将多个文件的内容合并。一般文件内容行数超过40行时,使用cat不宜将内容输出到屏幕。

2.特性实例说明

  • -E(end)选项可以显示出结束字符,用“$”字符表示结束
  • -T(tab)选项可以显示tab字符,用“^I”字符表示tab
  • -s(squeeze)可以压缩连续的空行为一行

使用-v选项可以显示出所有非可打印字符,结合上述字符就是-t选项等于-vT,-e选项等于-vE。最后-A可以显示所有字符,也就是-vET的合体。

user@ubuntu:~$ cat -E test
123$
    $
$
456
user@ubuntu:~$ cat -T test
123$
^I$
$
456
user@ubuntu:~$ cat -s test
123

456
user@ubuntu:~$ cat -a test
123$
^I$
$
456

另外还支持显示文件的行号,使用-n显示行号直接从第一行开始编号,对空行也计数。但是如果需要统计有效内容行数,可以使用-b选项跳过所有空行编号,只对有内容的行编号。

user@ubuntu:~$ cat -n test
    1 123
    2
    3
    4 456
user@ubuntu:~$ cat -b test
    1 123
    2 

    3 456

空行的定义是没人任何除换行符之外的字符的行,上述测试文件中第二行有一个tab字符也是算为有内容的行,从而也进行编号了。

3.衍生tac

tac是cat命令逆序的字符串,意义就是和cat命令的功能相反。从文件的最后一行进行依次输出,直到文件第一行为止。

2.nl

1.常用内容

nl命令在linux系统中用来计算文件中行号,当然也是直接输出文件内容。nl 可以将输出的文件内容自动的加上行号!其默认的结果与 cat -n 有点不太一样, nl 可以将行号做比较多的显示设计,包括位数与是否自动补齐 0 等等的功能。常用选项如下:

    -b  :指定行号指定的方式,主要有两种:
        -b a :表示不论是否为空行,也同样列出行号(类似 cat -n);
        -b t :如果有空行,空的那一行不要列出行号(默认值);
    -n  :列出行号表示的方法,主要有三种:
        -n ln :行号在萤幕的最左方显示;
        -n rn :行号在自己栏位的最右方显示,且不加 0        -n rz :行号在自己栏位的最右方显示,且加 0    -w  : 行号栏位的占用的位数,默认为6位。
    -p : 在逻辑定界符处不重新开始计算

完整选项如下:
这里写图片描述

user@ubuntu:~$ nl -b t test
    1 123
    2 

    3 456
user@ubuntu:~$ nl -n ln test
1     123
2   

3     456
user@ubuntu:~$ nl -n rz test
000001 123
000002  

000003 456
user@ubuntu:~$ nl -n rz -w 2 test
01  123
02

03  456
user@ubuntu:~$ nl -n ln -i 2 test
1       123
3       

5       456
user@ubuntu:~$ nl -n rn -s 'row:' test
    1row:123
    2row:

    3row:456

nl 命令读取 File 参数(缺省情况下标准输入),计算输入中的行号,将计算过的行号写入标准输出。 在输出中,nl 命令根据您在命令行中指定的标志来计算左边的行。 -i可以设置行号增量,默认为1。-s可以设置插入到行号后的字符串。

2.扩展

输入文本必须写在逻辑页中。每个逻辑页有头、主体和页脚节(可以有空节)。-p选项设置后nl命令将从每个逻辑页开始重新编号,-d可以设置逻辑页的分隔符。另外,-f和-h选项可以设置逻辑页的页脚、页头的格式。

3.od

上述命令将文件输出到屏幕或者是管道符,但是都是非二进制文件。如果遇到二进制文件,上述命令会出现乱码,此时可以使用od这个命令来查看二进制文件的字节信息。

1.命令概览

这里写图片描述
最常用的选项就是-t,后接各种类型来进行输出,当然也有为了保持兼容的传统选项,上图中可以看出能用-t TYPE的各种方式构建出来。各种类型如下:

    a:利用默认字符输出
    c:ASCII字符或者转义字符表示
    d[SIZE]:利用有符号十进制(decimal)数输出数据,每个数占用SIZE个字节
    f[SIZE]:利用浮点数输出数据,每个数占用SIZE个字节
    o[SIZE]:利用八进制输出数据,每个数占用SIZE个字节
    u[SIZE]:利用无符号十进制数表示,每个数占用SIZE个字节
    x[SIZE]:利用十六进制数表示,每个数占用SIZE个字节

SIZE:是一个数字,用字符表示。当TYPE是d/o/u/x时,有如下选项:
    C : sizeof(char)
    S : sizeof(short)
    I : sizeof(int)
    L : sizeof(long)
当TYPE是f时,为如下选项:
    F : sizeof(float)
    D : sizeof(double)
    L : sizeof(long double)

-N选项可以指定读取的二进制字节数目,-j选项可以指定跳过开头的指定书目字节。-S BYTES指定输出至少BYTES个可打印字符。-w可以指定每行打印的字节数目。-A选项的RADIX指定文件的偏移量输出格式:d(decimal)、x(hex)、o(oct)、n(none),默认格式为八进制表示。

user@ubuntu:~$ od -t x1 -N 16 -A x /usr/bin/od
000000 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00
000010
user@ubuntu:~$ od -t x1 -N 12 -Ax -j4 /usr/bin/od
000004 01 01 01 00 00 00 00 00 00 00 00 00
000010
user@ubuntu:~$ od -t x1 -N 16 /usr/bin/od
0000000 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00
0000020
user@ubuntu:~$ od -t xCc -N16 /usr/bin/od
0000000 7f 45 4c 46  01  01  01 00 00 00 00 00 00 00 00 00
        177 E  L  F 001 001 001 \0 \0 \0 \0 \0 \0 \0 \0 \0
0000020

对-t选项后面可以接多个类型,从而可以进行对照查看,x选项显示十六进制表示,c表示对于的ASCII表示。另外,所有的BYTES参数,默认不带单位就是字节,可以加上b(512)、kB(1000)、K(1024)、MB(1000*1000)、M(1024*1024)、GB/G/TB/T/PB/P/EB/E/ZB/Z/YB/Y。
使用 od命令对直接查看二进制文件格式,查阅字节信息的开发者来说非常有用。

2020-02-05 19:46:05 kingfox 阅读数 63

Linux下的当前正在运行的进程信息均存放在/proc目录下,有一系列以数字为名的子目录,每一个子目录对应一个进程,子目录名就是进程的pid。子目录下的status文件内容就是进程的基本信息,包括进程名、pid、ppid等。因此,若要扫描系统当前正在运行的所有进程,只需要遍历/proc目录下所有以数字为名的子目录下的status即可。据此,可得到获取当前系统所有进程快照、根据pid获得进程名和根据进程名获得pid的程序,如下所示:

#include <sys/types.h>
#include <dirent.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

#define BUF_SIZE 1024
#define MAX_PROCESS_PATH 1024
#define PROC_NAME_FIELD ("name:")
#define PARENT_PID_FIELD ("ppid:")

#ifndef __cplusplus
typedef enum {false, true} bool;
#endif // __cplusplus

typedef struct __tagProcessEntry
{
   pid_t pid;
   pid_t ppid;
   char processName[MAX_PROCESS_PATH];
} ProcessEntry;

void string2lower(const char src[], char dest[])
{
   int length = strlen(src);
   int index;
   for(index = 0; index < length; index ++)
   {
      dest[index] = ((src[index] >= 'A') && (src[index] <= 'Z')) ? src[index] + 0x20 : src[index];
   }
   dest[length] = '\0';
}

int createProcessSnapshot(ProcessEntry pes[], int maxCount)
{
   int processCount = 0;
   DIR *dir;
   struct dirent *dirEntry;
   FILE *fp;
   char filePath[MAX_PROCESS_PATH];
   char fieldName[32];
   char fieldValue[MAX_PROCESS_PATH];
   char buf[BUF_SIZE];

   dir = opendir("/proc");
   if (NULL != dir)
   {
      while((dirEntry = readdir(dir)) != NULL) //循环读取路径下的每一个文件/文件夹
      {
         //如果读取到的是"."或者".."则跳过,读取到的不是文件夹名字也跳过
         if ((strcmp(dirEntry->d_name, ".") == 0) || (strcmp(dirEntry->d_name, "..") == 0) || (DT_DIR != dirEntry->d_type))
         {
            continue;
         }

         sprintf(filePath, "/proc/%s/status", dirEntry->d_name); //生成要读取的文件的路径
         fp = fopen(filePath, "r");
         if (NULL != fp)
         {
            do {
               if (fgets(buf, BUF_SIZE - 1, fp) == NULL)
               {
                  break;
               }
               sscanf(buf, "%s %s", fieldName, fieldValue);
               string2lower(fieldName, fieldName);
               if (strcmp(fieldName, PROC_NAME_FIELD) == 0)
               {
                  strcpy(pes[processCount].processName, fieldValue);
               }
               else if (strcmp(fieldName, PARENT_PID_FIELD) == 0)
               {
                  pes[processCount].ppid = atoi(fieldValue);
               }
            } while(!feof(fp));
            fclose(fp);

            pes[processCount].pid = atoi(dirEntry->d_name);
            processCount ++;
            if (processCount >= maxCount)
            {
               break;
            }
         }
      }
      closedir(dir);
   }
   return processCount;
}

int getPidByName(const char *procName, pid_t pids[], int maxCount)
{
   DIR *dir;
   struct dirent *dirEntry;
   FILE *fp;
   char filePath[MAX_PROCESS_PATH];
   char currProcName[MAX_PROCESS_PATH];
   char buf[BUF_SIZE];
   int pidCount = 0;

   dir = opendir("/proc");
   if (NULL != dir)
   {
      while((dirEntry = readdir(dir)) != NULL) //循环读取路径下的每一个文件/文件夹
      {
         //如果读取到的是"."或者".."则跳过,读取到的不是文件夹名字也跳过
         if ((strcmp(dirEntry->d_name, ".") == 0) || (strcmp(dirEntry->d_name, "..") == 0) || (DT_DIR != dirEntry->d_type))
         {
            continue;
         }

         sprintf(filePath, "/proc/%s/status", dirEntry->d_name); //生成要读取的文件的路径
         fp = fopen(filePath, "r"); //打开进程描述文件
         if (NULL != fp)
         {
            if (fgets(buf, BUF_SIZE - 1, fp) == NULL)
            {
               fclose(fp);
               continue;
            }
            sscanf(buf, "%*s %s", currProcName);

            if (strcmp(procName, currProcName) == 0)
            {
               pids[pidCount] = atoi(dirEntry->d_name);
               pidCount ++;
               if (pidCount >= maxCount)
               {
                  break;
               }
            }
            fclose(fp);
         }
      }
      closedir(dir);
   }
   return pidCount;
}

bool getNameByPid(pid_t pid, char procName[])
{
   char pidPath[BUF_SIZE];
   char buf[BUF_SIZE];
   bool success = false;

   sprintf(pidPath, "/proc/%d/status", pid);
   FILE *fp = fopen(pidPath, "r");
   if (NULL != fp)
   {
      if (fgets(buf, BUF_SIZE - 1, fp) != NULL)
      {
         sscanf(buf, "%*s %s", procName);
         success = true;
      }
      else
      {
         success = false;
      }
      fclose(fp);
   }

   return success;
}

int main(int argc, char **argv)
{
   char procName[MAX_PROCESS_PATH];
   pid_t pids[32];
   ProcessEntry pes[1024];

   pid_t currPid = getpid();
   printf("pid of this process:%d\n", currPid);
   getNameByPid(currPid, procName);
   printf("task name is %s\n", procName);
   strcpy(procName, "eclipse");
   int pidCount= getPidByName(procName, pids, sizeof pids / sizeof pids[0]);
   for(int index = 0; index < pidCount; index ++)
   {
      printf("pid of process %s: %d\n", procName, pids[index]);
   }

   int procCnt = createProcessSnapshot(pes, sizeof pes / sizeof pes[0]);
   printf("%d processes found.\n", procCnt);
   for(int index = 0; index < procCnt; index ++)
   {
      printf("proc: %-16s, pid: %6d, ppid: %6d.\n", pes[index].processName, pes[index].pid, pes[index].ppid);
   }

   return 0;
}

上述代码大部分源于网上材料,我在这里只是整理了一下,做为笔记。

2019-09-27 17:07:21 weixin_43428906 阅读数 16

1、【场景驱动学习】在第三章中,介绍了使用编辑器编辑文档内容,那么编辑完成后,有那些办法获取文档的内容呢?

  • 使用vim编辑器查看文档内容
    • vim filename
  • 但我并不想以编辑的方式获取文档的内容,此时可以使用cat命令
    • cat [option] filename
      • -n >此选项会在显示内容前加行号
  • 如果我想将文档的内容反向显示时,可以使用tac命令
    • tac filename >反向列出文档内容
  • tac和cat均适合文档内容较少的情况,当文档内容过多时,可以使用more命令,more命令可以向下翻页显示内容
    • more filename
  • 由于more只能向下翻页,而不能向上翻页,那么有命令可以既能向上又能向上呢?
    • less filename
  • 以上命令均为获取文档的所有内容的,但有时候我只想看到前面几行的内容,如何处理呢?
    • head -n num filename >显示文档filename前num行的内容
  • 如果我只想获取文档后面几行内容,如何处理呢?
    • tail -n num filename >显示文档filename后num行的内容

【以上就是获取文档内容的方法及如何将这些命令串联起来的逻辑】

2018-08-18 16:49:09 espressomike 阅读数 489

计算机的组成及功能

cpu

 cpu是计算机的核心部分,由两部分组成,分别是控制器和运算器。控制器读取存储器上存储的数据和指令,提供给运算器进行运算,并由控制器决定运算结果在存储器上的存储位置。

内存

 内存,也就是存储器,用于存储数据和指令,供cpu读取,并且也存储cpu的运算结果。

输入

 输入设备,可以将人们比较熟悉的信息形式转换未计算机可以理解的信息形式,例如鼠标、键盘。

输出

 输出设备,可以将计算机的运算结果转化为人类比较容易理解的信息形式,例如显示器

硬盘

 在冯诺依曼体系中,硬盘既不属于输入设备,也不属于输出设备,它是外存储器。相对于内存的易失性存储,硬盘可以在较长一段时间内稳定的存储数据,断电后也不会丢失数据(取决于使用的文件系统,对于某些文件系统,可能会丢失一部分没来得及同步到硬盘的数据)。

北桥

 高速总线控制器,实现大量快速数据交换,离cpu较近,将硬盘直连北桥,可以在一定程度上提升IO能力。

南桥

 用于连接各种外围设备,这些设备在南桥汇总后,通过北桥转给cpu。

Linux的发行版本和相互之间的关系

主流发行版本

  • RedHat
    • RedHat Enterprise
      • CentOS
    • Fedora
  • SlackWare
    • SUSE
  • Debian
    • Ubuntu

相互之间的关系

  所有Linux的发行版本使用的内核都是由Linus负责维护的Linux内核,这个内核是抽象了硬件的功能,管理硬盘和文件系统,并提供多任务功能的系统核心,不同的发行版本主要区别在于软件的管理上:RedHat系列的使用yum管理rpm格式的软件包;S.U.S.E软件包的格式也是rpm,使用zypper进行管理;Debian使用apt-get管理deb格式的软件包。

Linux的哲学思想

  1. 一切皆文件
    在Linux系统中,一切皆文件。文件、目录、硬盘、DVD、字符设备、块设备等在Linux中都被看作是文件,在一套操作界面中进行操作。
  2. 小型单一用途的程序
    Linux内核由众多实现单一功能用途的小型程序组成,所以可以高效的运行。
  3. 尽量避免与用户交互
  4. 使用文本文件保存程序配置信息

Linux命令

Linux命令使用格式

COMMAND [OPTIONS] [ARGUMENTS]
1.COMMAND:命令
2.OPTIONS:选项,当有多个选项时可以写在一起
3.短选项和长选项,例如-a等价于–all
4.中括号为可选项,非必须
i.e.
ls的命令使用格式:ls [OPTION]… [FILE]…

[bhps@test run]$ ls -lh
total 76K
drwxr-x--- 2 bhps root 4.0K Oct 19  2016 bin
drwxr-x--- 2 bhps root 4.0K Mar  9  2017 cfg
drwxr-x--- 6 bhps root 4.0K Jan 18  2016 data
drwxr-x--- 2 bhps root 4.0K Mar  2  2016 include
drwxr-x--- 4 bhps root 4.0K Dec 17  2015 java
drwxr-x--- 2 bhps root  36K Aug 18 00:14 log
drwxr-x--- 2 bhps root 4.0K Mar  9  2017 shell
drwxr-x--- 6 bhps root 4.0K Mar  1  2016 src
drwxr-x--- 2 bhps root 4.0K Jan 20  2016 tmp
drwxr-x--- 3 bhps root 4.0K Jul  6  2016 wkhtmltox

以上为将多个短选项写在一起执行,结果为当前目录下文件及目录的详细信息,大小以人类可读格式展示

[bhps@test run]$ ls --inode 
1715958 bin  1715971 cfg  1711474 data  1715943 include  1715990 java  1711465 log  1715976 shell  1710783 src  1715956 tmp  1715939 wkhtmltox

上面的命令使用长选项,显示目录下所有文件夹和文件的inode号

[bhps@nopaper-1 run]$ ls -dl bin
drwxr-x--- 2 bhps root 4096 Oct 19  2016 bin

上面的命令使用命令,多个短选项和参数的形式,查看了bin目录的属性

Linux常用命令介绍

  • ifconfig
    ifconfig 用于配置网络设备,也可以查看网络设备的信息
    基本命令格式
    ifconfig [interface] 不加参数,查看所有启用网络设备的信息,加参数,查看具体某个设备的信息
    ifconfig up interface启动某设备
    ifconfig down interface 关闭某设备
    ifconfig interface ip [netmask ip broadcast ip] 为某设备配置ip,子网掩码,广播地址
    ifconfig interface apr 为某设备开启apr协议
    ifconfig interface -apr 为某设备关闭apr协议
    ifconfig interface hw {ether|ax25|ARCnet|netrom} hardware address 为网卡配置硬件地址,需要网卡支持此功能
  • echo
    echo 用于显示一段文本
    echo [short option] string|variable
       -n 不输出换行符,没有此选项的话,输出文本或变量内容后,自动换行
       -e 转义斜线后的内容,\t水平制表符,\v垂直制表符,\b在此符号位置运行退格键删除前一个字符
  • tty
    tty输出连接到标准输入的终端的文件名称
     -s 不输出任何内容,进返回退出状态0
     –help 输出帮助信息
     –version 输出版本信息
  • startx
    startx  在终端上启动X会话
      -w 强制启动X会话
      -z .xinitrc 使用脚本.xinitrc启动会话
  • export
    export -fnp [name[=word]] 管理环境变量
    -f name 为函数名称
    -n 从环境变量中移除name
    -p 输出当前所有环境变量
    =word 为环境变量赋值
  • pwd
    pwd 打印当前目录名称
      -L 默认选项,使用逻辑路径,如果是连接文件,显示连接文件路径
      -P 不适用逻辑路径,连接文件最终指向的文件
  • history
    history   显示命令行历史记录
      -c 清空当前命令历史
      -a 将历史命令缓冲区中命令写入历史命令文件中
      -r 将历史命令文件中的命令读入当前历史命令缓冲区
      -w 将当前历史命令缓冲区命令写入历史命令文件中
      -n 打印最近n条历史命令
  • shutdown
    shutdown [OPTION] TIME 关闭系统
         -r 关闭系统后重启
         -h 关闭系统后,由系统决定停机还是断电。
         -H 关闭系统后停机
         -P 关闭系统后断电
         -k 模拟关机,向登陆者发送告警信息,不会关机
         -c 取消关机
    i.e.
    shutdown -h now   指定现在关机
    shutdown +2 “The system is going down in two minutes.”  系统2分钟后关机
  • poweroff
    poweroff  关机命令相当于shutdown -P now,关闭系统后,断电。
  • reboot
    reboot  重启系统,相当于shutdown -r now
  • hwclock
    hwclock
       -w 将系统时间同步给硬件,覆盖当前硬件时间
       -s 将硬件时间同步给系统
       -r 输出硬件时间到标准输出
  • date
    date  展示,设置系统时间或日期
      -s 设置时间
      -d ‘n days ago’ 显示n天前的时间
      +%Y%m%d 格式化输出时间,按照年月日输出
符号 含义
%Y 4位年份
%m 2位月份
%d 2位天数
%H 小时,0~23
%M 分钟,0~59
%S 秒数,0~59

i.e.
date -d ‘7 days ago’ +%Y%m%d 按照年月日时分秒的格式输出7天前的时间,按照年月日的格式

如何获取Linux的帮助信息

  • info
    info COMMAND 对man的补充说明,支持ctl+b,ctl+f的上下翻页
  • help
    COMMAND –help 对于支持此选项的命令,可以使用–help查看命令帮助
  • man
    man COMMAND
    man分章节,常见章节有8个
    1.用户命令(一般位于这些目录/bin,/usr/bin,/usr/local/bin)
    2.系统调用
    3.库用户
    4.特殊文件
    5.文件格式(配置文件的语法,例如man 5 passwd)
    6.游戏(贪吃蛇,推箱子,扫雷,linux默认没装)
    7.杂项(Miscellaneous)
    8.管理命令(/sbin,/usr/sbin/,/usr/local/sbin)
    可以使用如下面命令查看whatis COMMAND 显示命令有哪些章节

Linux基础目录名称和命名法则及功能规定

  • /boot:系统启动的相关文件,如内核,initrd,以及grub(bootloader)
  • /dev: 设备文件
    块设备:随机访问,数据块
    字符设备:线性访问,按字符为单位(显示器,鼠标都是线性设备)
    设备号:主设备号(major)和次设备号(minor)
  • /etc:配置文件目录
  • /home:用户的家目录:默认为与用户名同名的目录/home/USERNAME
  • /root:管理员的家目录
  • /lib:库文件
    静态库: .a
    动态库: .dll(windows), .so(shared objects) —-任何库文件都需要载入的内存中才能供程序使用,共享库就是如此,载入到内存中,如果不同程序都用到了这个库,则无需重复载入。静态编译的话,程序本身就包含了库文件(静态库)。如果是动态库的话,迁移文件后,还要保证现有环境中存在此动态库。虽然静态库便于程序的迁移使用,但是动态库减少的程序的冗余,使得库可以在程序之间共享。库文件无法单独执行,没有程序的可执行入口,只能被程序调用
    • /lib/modules:内核模块文件
  • /media:挂载点目录,通常用于挂载移动设备,如光盘,u盘
  • /mnt:挂载点目录,通常用于挂载额外的临时文件系统
    对于linux来说,新添加的光盘或者硬盘,需要与根文件系统中的某个目录关联,才能对设备进行访问
  • /opt:可选目录,早期用于安装第三方软件,现在第三方软件一般安装在/usr/local/下
  • /proc:伪文件系统,是内核信息在文件系统上的映射,在系统未启动时,硬盘中的该目录为空。其中主要是内核的工作数据和可调参数
  • /sys:伪文件系统,跟硬件设备相关的属性映射文件
  • /tmp:临时文件(一般来说,如果文件在一个月内未被访问,系统会自动清除), /var/tmp
  • /var:可变化的文件,系统日志位于/var/log下
  • /bin:可执行文件,用户名命令
  • /sbin:可执行文件,管理命令
  • /usr/local :第三方软件的安装目录

linux获取pid脚本

阅读数 51

没有更多推荐了,返回首页