{
    "mode": "man",
    "parameter": "procmailsc",
    "section": "5",
    "url": "https://www.chedong.com/phpMan.php/man/procmailsc/5/json",
    "generated": "2026-10-04T14:30:42Z",
    "synopsis": "[*] w^x condition",
    "sections": {
        "NAME": {
            "content": "procmailsc - procmail weighted scoring technique\n",
            "subsections": []
        },
        "SYNOPSIS": {
            "content": "[*] w^x condition\n",
            "subsections": []
        },
        "DESCRIPTION": {
            "content": "In  addition to the traditional true or false conditions you can specify on a recipe, you can\nuse a weighted scoring technique to decide if a certain recipe matches or not.  When weighted\nscoring is used in a recipe, then the final score for that recipe must be positive for it  to\nmatch.\n\nA certain condition can contribute to the score if you allocate it a `weight' (w) and an `ex‐\nponent' (x).  You do this by preceding the condition (on the same line) with:\nw^x\nWhereas both w and x are real numbers between -2147483647.0 and 2147483647.0 inclusive.\n\n",
            "subsections": []
        },
        "Weighted regular expression conditions": {
            "content": "The  first time the regular expression is found, it will add w to the score.  The second time\nit is found, w*x will be added.  The third time it is found, w*x*x will be added.  The fourth\ntime w*x*x*x will be added.  And so forth.\n\nThis can be described by the following concise formula:\n\nn\nn   k-1        x - 1\nw * Sum x    = w * -------\nk=1             x - 1\n\nIt represents the total added score for this condition if n matches are found.\n\nNote that the following case distinctions can be made:\n\nx=0     Only the first match will contribute w to the score.  Any subsequent matches are  ig‐\nnored.\n\nx=1     Every  match  will contribute the same w to the score.  The score grows linearly with\nthe number of matches found.\n\n0<x<1   Every match will contribute less to the score than the previous one.  The score  will\nasymptotically approach a certain value (see the NOTES section below).\n\n1<x     Every  match will contribute more to the score than the previous one.  The score will\ngrow exponentially.\n\nx<0     Can be utilised to favour odd or even number of matches.\n\nIf the regular expression is negated (i.e., matches if it isn't found), then n obviously  can\neither be zero or one.\n",
            "subsections": []
        },
        "Weighted program conditions": {
            "content": "If  the  program returns an exitcode of EXITSUCCESS (=0), then the total added score will be\nw.  If it returns any other exitcode (indicating failure), the total added score will be x.\n\nIf the exitcode of the program is negated, then, the exitcode will be  considered  as  if  it\nwere  a virtual number of matches.  Calculation of the added score then proceeds as if it had\nbeen a normal regular expression with n=`exitcode' matches.\n",
            "subsections": []
        },
        "Weighted length conditions": {
            "content": "If the length of the actual mail is M then:\n\n* w^x  > L\n\nwill generate an additional score of:\n\nx\n/  M  \\\nw * | --- |\n\\  L  /\n\nAnd:\n\n* w^x  < L\n\nwill generate an additional score of:\n\nx\n/  L  \\\nw * | --- |\n\\  M  /\n\nIn both cases, if L=M, this will add w to the score.  In  the  former  case  however,  larger\nmails  will  be favoured, in the latter case, smaller mails will be favoured.  Although x can\nbe varied to fine-tune the steepness of the function, typical usage sets x=1.\n",
            "subsections": []
        },
        "MISCELLANEOUS": {
            "content": "As soon as `plus infinity' (2147483647) is reached, any subsequent weighted  conditions  will\nsimply be skipped.\n\nAs soon as `minus infinity' (-2147483647) is reached, the condition will be considered as `no\nmatch' and the recipe will terminate early.\n",
            "subsections": []
        },
        "EXAMPLES": {
            "content": "The  following recipe will ditch all mails having more than 150 lines in the body.  The first\ncondition contains an empty regular expression which, because it always matches, is  used  to\ngive  our score a negative offset.  The second condition then matches every line in the mail,\nand consumes up the previous negative offset we gave (one point per line).  In the  end,  the\nscore will only be positive if the mail contained more than 150 lines.\n\n:0 Bh\n* -150^0\n*    1^1  ^.*$\n/dev/null\n\nSuppose  you  have  a priority folder which you always read first.  The next recipe picks out\nthe priority mail and files them in this special folder.  The first condition  is  a  regular\none,  i.e.,  it  doesn't  contribute to the score, but simply has to be satisfied.  The other\nconditions describe things like: john and claire usually have  something  important  to  say,\nmeetings are usually important, replies are favoured a bit, mails about Elvis (this is merely\nan example :-) are favoured (the more he is mentioned, the more the mail is favoured, but the\nmaximum  extra score due to Elvis will be 4000, no matter how often he is mentioned), lots of\nquoted lines are disliked, smileys are appreciated (the score for those will reach a  maximum\nof  3500),  those three people usually don't send interesting mails, the mails should prefer‐\nably be small (e.g., 2000 bytes long mails will score -100, 4000 bytes long mails  do  -800).\nAs  you  see, if some of the uninteresting people send mail, then the mail still has a chance\nof landing in the priority folder, e.g., if it is about a meeting, or if it contains at least\ntwo smileys.\n\n:0 HB\n*         !^Precedence:.*(junk|bulk)\n* 2000^0   ^From:.*(john@home|claire@work)\n* 2000^0   ^Subject:.*meeting\n*  300^0   ^Subject:.*Re:\n* 1000^.75 elvis|presley\n* -100^1   ^>\n*  350^.9  :-\\)\n* -500^0   ^From:.*(boss|jane|henry)@work\n* -100^3   > 2000\npriorityfolder\n\nIf you are subscribed to a mailinglist, and just would like to read the quality  mails,  then\nthe  following  recipes  could do the trick.  First we make sure that the mail is coming from\nthe mailinglist.  Then we check if it is from certain persons of whom we value  the  opinion,\nor  about  a subject we absolutely want to know everything about.  If it is, file it.  Other‐\nwise, check if the ratio of quoted lines to original lines is at most  1:2.   If  it  exceeds\nthat, ditch the mail.  Everything that survived the previous test, is filed.\n\n:0\n^From mailinglist-request@some.where\n{\n:0:\n* ^(From:.*(paula|bill)|Subject:.*skiing)\nmailinglist\n\n:0 Bh\n*  20^1 ^>\n* -10^1 ^[^>]\n/dev/null\n\n:0:\nmailinglist\n}\n\nFor further examples you should look in the procmailex(5) man page.\n",
            "subsections": []
        },
        "CAVEATS": {
            "content": "Because  this speeds up the search by an order of magnitude, the procmail internal egrep will\nalways search for the leftmost shortest match, unless it is determining  what  to  assign  to\nMATCH,  in which case it searches the leftmost longest match.  E.g. for the leftmost shortest\nmatch, by itself, the regular expression:\n\n.*     will always match a zero length string at the same spot.\n\n.+     will always match one character (except newlines of course).\n",
            "subsections": []
        },
        "SEE ALSO": {
            "content": "procmail(1), procmailrc(5), procmailex(5), sh(1), csh(1), egrep(1), grep(1),\n",
            "subsections": []
        },
        "BUGS": {
            "content": "If, in a length condition, you specify an x that causes an overflow, procmail is at the mercy\nof the pow(3) function in your mathematical library.\n\nFloating point numbers in `engineering' format (e.g., 12e5) are not accepted.\n",
            "subsections": []
        },
        "NOTES": {
            "content": "If  in  a regular expression weighted formula 0<x<1, the total added score for this condition\nwill asymptotically approach:\n\nw\n-------\n1 - x\n\nIn order to reach half the maximum value you need\n\n- ln 2\nn = --------\nln x\n\nmatches.\n",
            "subsections": []
        },
        "AUTHORS": {
            "content": "Stephen R. van den Berg\n<srb@cuci.nl>\n\nBuGless                                 PROCMAILSC(5)",
            "subsections": []
        }
    },
    "summary": "procmailsc - procmail weighted scoring technique",
    "flags": [],
    "examples": [
        "The  following recipe will ditch all mails having more than 150 lines in the body.  The first",
        "condition contains an empty regular expression which, because it always matches, is  used  to",
        "give  our score a negative offset.  The second condition then matches every line in the mail,",
        "and consumes up the previous negative offset we gave (one point per line).  In the  end,  the",
        "score will only be positive if the mail contained more than 150 lines.",
        ":0 Bh",
        "* -150^0",
        "*    1^1  ^.*$",
        "/dev/null",
        "Suppose  you  have  a priority folder which you always read first.  The next recipe picks out",
        "the priority mail and files them in this special folder.  The first condition  is  a  regular",
        "one,  i.e.,  it  doesn't  contribute to the score, but simply has to be satisfied.  The other",
        "conditions describe things like: john and claire usually have  something  important  to  say,",
        "meetings are usually important, replies are favoured a bit, mails about Elvis (this is merely",
        "an example :-) are favoured (the more he is mentioned, the more the mail is favoured, but the",
        "maximum  extra score due to Elvis will be 4000, no matter how often he is mentioned), lots of",
        "quoted lines are disliked, smileys are appreciated (the score for those will reach a  maximum",
        "of  3500),  those three people usually don't send interesting mails, the mails should prefer‐",
        "ably be small (e.g., 2000 bytes long mails will score -100, 4000 bytes long mails  do  -800).",
        "As  you  see, if some of the uninteresting people send mail, then the mail still has a chance",
        "of landing in the priority folder, e.g., if it is about a meeting, or if it contains at least",
        "two smileys.",
        ":0 HB",
        "*         !^Precedence:.*(junk|bulk)",
        "* 2000^0   ^From:.*(john@home|claire@work)",
        "* 2000^0   ^Subject:.*meeting",
        "*  300^0   ^Subject:.*Re:",
        "* 1000^.75 elvis|presley",
        "* -100^1   ^>",
        "*  350^.9  :-\\)",
        "* -500^0   ^From:.*(boss|jane|henry)@work",
        "* -100^3   > 2000",
        "priorityfolder",
        "If you are subscribed to a mailinglist, and just would like to read the quality  mails,  then",
        "the  following  recipes  could do the trick.  First we make sure that the mail is coming from",
        "the mailinglist.  Then we check if it is from certain persons of whom we value  the  opinion,",
        "or  about  a subject we absolutely want to know everything about.  If it is, file it.  Other‐",
        "wise, check if the ratio of quoted lines to original lines is at most  1:2.   If  it  exceeds",
        "that, ditch the mail.  Everything that survived the previous test, is filed.",
        ":0",
        "^From mailinglist-request@some.where",
        ":0:",
        "* ^(From:.*(paula|bill)|Subject:.*skiing)",
        "mailinglist",
        ":0 Bh",
        "*  20^1 ^>",
        "* -10^1 ^[^>]",
        "/dev/null",
        ":0:",
        "mailinglist",
        "For further examples you should look in the procmailex(5) man page."
    ],
    "see_also": [
        {
            "name": "procmail",
            "section": "1",
            "url": "https://www.chedong.com/phpMan.php/man/procmail/1/json"
        },
        {
            "name": "procmailrc",
            "section": "5",
            "url": "https://www.chedong.com/phpMan.php/man/procmailrc/5/json"
        },
        {
            "name": "procmailex",
            "section": "5",
            "url": "https://www.chedong.com/phpMan.php/man/procmailex/5/json"
        },
        {
            "name": "sh",
            "section": "1",
            "url": "https://www.chedong.com/phpMan.php/man/sh/1/json"
        },
        {
            "name": "csh",
            "section": "1",
            "url": "https://www.chedong.com/phpMan.php/man/csh/1/json"
        },
        {
            "name": "egrep",
            "section": "1",
            "url": "https://www.chedong.com/phpMan.php/man/egrep/1/json"
        },
        {
            "name": "grep",
            "section": "1",
            "url": "https://www.chedong.com/phpMan.php/man/grep/1/json"
        }
    ]
}