{
    "mode": "man",
    "parameter": "procmailsc",
    "section": "5",
    "url": "https://www.chedong.com/phpMan.php/man/procmailsc/5/json",
    "generated": "2026-06-16T10:00:36Z",
    "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",
            "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>\nPhilip A. Guenther\n<guenther@sendmail.com>\n\nBuGless                                     2001/08/04                              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"
        }
    ]
}