skip to Main Content
string cmd = "Static hostname: gatewayIcon name: computer - desktopChassis: desktopMachine ID: 706ecaf18cea4c919eb515d0e73c7fe4Boot ID: c2f95d12ab334e57ac7e6503f7d0cd87Operating System: CentOS Linux 8(Core)CPE OS Name: cpe:/ o:centos: centos: 8Kernel: Linux 4.18.0 - 147.3.1.el8_1.x86_64Architecture: x86 - 64Thu Dec 30 15:31:24 EST 2021total used free shared buff / cache availableMem: 7887756 455084 4067136 427084 3365536 6746868Swap: 8183804 0 8183804Filesystem Size Used Avail Use % Mounted ondevtmpfs 3.8G 0 3.8G 0 % / devtmpfs 3.8G 84K 3.8G 1 % / dev / shmtmpfs 3.8G 417M 3.4G 11 % / runtmpfs 3.8G 0 3.8G 0 % / sys / fs / cgroup/ dev / mapper / cl - root 50G 3.2G 47G 7 % // dev / sda2 976M 188M 721M 21 % / boot/ dev / sda1 599M 6.8M 593M 2 % / boot / efi/ dev / mapper / cl - home 53G 12G 42G 22 % / hometmpfs 771M 200K 771M 1 % / run / user / 1000total 120G 15G 105G 13 % -procs---------- - memory------------ - swap------ - io---- - system--------cpu---- -r b swpd free buff cache si so bi bo in cs us sy id wa st2 0 0 4067108 4884 3360652 0 0 0 2 1 3 37 2 61 0 0";
diagtext = cmd;

split = Regex.Split(diagtext, @"%");

foreach (var item in split)
{
   diskmem = split[10];
}

So I have this long string called cmd and I’m using regex to display a particular string next to the percentage % (sign). I was able to display this string: / run / user / 1000total 120G 15G 105G 13 %, but I only need the 13 not the strings before 13.

How can I do this?

4

Answers


  1. You can use this regex string to get all percentage counts before any % symbols:

    ([d]{1,3})s%
    
    Login or Signup to reply.
  2. I am not aloud to comment, so I’ll put my comment in this answer.
    A little more information about the data structure is needed to properly answer this question, but at first glance, it looks like you can split this string with spaces and grab the 10th item. On another note, I would like to know why your are using a foreach loop. You are not using var item.

    string[] items = diskmem.Split(' ');
    
    Login or Signup to reply.
  3. Make another split using a white space delimiter for each index of the split[] array, the last index of the resplit[] array will be the string before the % sign until the first white space occurrence:

    static void SomeMethod()
    {
        string cmd = @"Static hostname: gatewayIcon name: computer - desktopChassis: desktopMachine ID:
                       706ecaf18cea4c919eb515d0e73c7fe4Boot ID: c2f95d12ab334e57ac7e6503f7d0cd87Operating System:
                       CentOS Linux 8(Core)CPE OS Name: cpe:/ o:centos: centos: 8Kernel: Linux 4.18.0 - 147.3.1.el8_1.x86_64Architecture: x86
                       - 64Thu Dec 30 15:31:24 EST 2021total used free shared buff / cache availableMem:
                       7887756 455084 4067136 427084 3365536 6746868Swap: 8183804 0 8183804Filesystem Size
                       Used Avail Use % Mounted ondevtmpfs
                       3.8G 0 3.8G 0 % / devtmpfs 3.8G 84K 3.8G 1 % / dev / shmtmpfs 3.8G 417M 3.4G 11 % / runtmpfs
                       3.8G 0 3.8G 0 % / sys / fs / cgroup/ dev / mapper / cl
                       - root 50G 3.2G 47G 7 % // dev / sda2 976M 188M 721M 21
                       % / boot/ dev / sda1 599M 6.8M 593M 2 % / boot / efi/ dev
                       / mapper / cl - home 53G 12G 42G 22 % / hometmpfs 771M 200K
                       771M 1 % / run / user / 1000total 120G 15G 105G 13
                       % -procs---------- - memory------------ - swap------ - io---- - system--------cpu---- -r b
                       swpd free buff cache si so bi bo in cs us sy id wa st2 0 0 4067108 4884 3360652 0 0 0 2 1 3 37 2 61 0 0";
        diagtext = cmd;    
        split = Regex.Split(diagtext, @"%");    
        var resplit = split[10].Split(" ".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
        // OUTPUT: '13'
        string finalResult = resplit[resplit.Length - 1];        
    }
    
    Login or Signup to reply.
  4. You’re missing some pattern we can use to get a consistent result, but assuming the string you parse is the penultimate as per the sample string you show, you can use Split to get the last value of the penultimate split string:

    //...
    var split = Regex.Split(diagtext, @"%"); // your code
    
    var target = split.ElementAt(split.Length - 2).Split(); //split the string
    var val = target.ElementAt(target.Length - 2); //isolate the value 13
    

    Live demo

    Or

    var target = split.ElementAt(split.Length - 2).Split()
        .Where(p => p != string.Empty).ToArray();
    //...
    

    If you want to skip spaces.

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search